PageRenderTime 49ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Core/Results/Result.cs

https://bitbucket.org/efz/effiproz
C# | 1695 lines | 708 code | 369 blank | 618 comment | 39 complexity | 67e218cea1f67dc2350a9e3309bc9621 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. //
  2. // (C) Copyright 2009,2010 EffiProz Systems
  3. // All rights reserved.
  4. // NOTICE: This code has not been licensed under any public license.
  5. // Author: Irantha Suwandarathna (irantha@gmail.com)
  6. //
  7. //synched 2.01rc3
  8. using System;
  9. using System.IO;
  10. using EffiProz.Core.DataTypes;
  11. using EffiProz.Core.Engine;
  12. using EffiProz.Core.Errors;
  13. using EffiProz.Core.Lib;
  14. using EffiProz.Core.Navigators;
  15. using EffiProz.Core.Statements;
  16. using EffiProz.Core.Tables;
  17. namespace EffiProz.Core.Results
  18. {
  19. internal class Result
  20. {
  21. internal static ResultMetaData SessionAttributesMetaData = GetSessionAttributesMetaData();
  22. private static readonly ResultMetaData EmptyMeta =
  23. ResultMetaData.NewResultMetaData(0);
  24. internal static Result EmptyGeneratedResult =
  25. NewDataResult(EmptyMeta);
  26. internal static Result UpdateZeroResult = NewUpdateCountResult(0);
  27. internal static Result UpdateOneResult = NewUpdateCountResult(1);
  28. // type of result
  29. // database name for new connection
  30. private readonly String _databaseName = string.Empty;
  31. // user / password for new connection
  32. // error strings in error results
  33. private readonly String _zoneString = String.Empty;
  34. private Result _chainedResult;
  35. public int DatabaseId;
  36. // vendor error code
  37. private int _errorCode;
  38. // the exception if this is an error
  39. private CoreException _exception;
  40. // prepared statement id
  41. // fetch size (in)
  42. private int _fetchSize;
  43. private int _generateKeys = ResultConstants.ReturnNoGeneratedKeys;
  44. public ResultMetaData GeneratedMetaData;
  45. private long _id;
  46. // secondary result
  47. //
  48. private int _lobCount;
  49. private ResultLob _lobResults;
  50. private String _mainString;
  51. /** A Result object's metadata */
  52. public ResultMetaData MetaData;
  53. public byte Mode;
  54. public RowSetNavigator navigator;
  55. /** Additional meta data for parameters used in PREPARE_ACK results */
  56. public ResultMetaData ParameterMetaData;
  57. /** Additional meta data for required generated columns */
  58. //
  59. public int QueryTimeout;
  60. public int RsProperties;
  61. public long SessionId;
  62. //
  63. //
  64. internal Statement statement;
  65. private long _statementId;
  66. // statement type based on whether it returns an update count or a result set
  67. // type of session info requested
  68. private int _statementReturnType;
  69. private String _subString;
  70. public int UpdateCount;
  71. public Object ValueData;
  72. private static ResultMetaData GetSessionAttributesMetaData()
  73. {
  74. ResultMetaData SessionAttributesMetaData =
  75. ResultMetaData.NewResultMetaData(SessionInfoTypeConsts.InfoLimit);
  76. for (int i = 0; i < SessionInfoTypeConsts.InfoLimit; i++)
  77. {
  78. SessionAttributesMetaData.columns[i] = new ColumnBase(null, null,
  79. null, null);
  80. }
  81. SessionAttributesMetaData.columns[SessionInfoTypeConsts.InfoId].SetType(
  82. SqlType.SqlInteger);
  83. SessionAttributesMetaData.columns[SessionInfoTypeConsts.InfoInteger].SetType(
  84. SqlType.SqlInteger);
  85. SessionAttributesMetaData.columns[SessionInfoTypeConsts.InfoBoolean].SetType(
  86. SqlType.SqlBoolean);
  87. SessionAttributesMetaData.columns[SessionInfoTypeConsts.InfoVarchar].SetType(
  88. SqlType.SqlVarchar);
  89. SessionAttributesMetaData.PrepareData();
  90. return SessionAttributesMetaData;
  91. }
  92. public Result(int mode)
  93. {
  94. Mode = (byte) mode;
  95. }
  96. public Result(int mode, int count)
  97. {
  98. Mode = (byte) mode;
  99. UpdateCount = count;
  100. }
  101. public static Result NewResult(RowSetNavigator nav)
  102. {
  103. var result = new Result(ResultConstants.Data) {navigator = nav};
  104. return result;
  105. }
  106. public static Result NewResult(int type)
  107. {
  108. RowSetNavigator navigator = null;
  109. switch (type)
  110. {
  111. case ResultConstants.CallResponse:
  112. case ResultConstants.Execute:
  113. case ResultConstants.UpdateResult:
  114. break;
  115. //case ResultConstants.BATCHEXECUTE:
  116. case ResultConstants.BatchExecDirect:
  117. navigator = new RowSetNavigatorClient(4);
  118. break;
  119. case ResultConstants.SetSessionAttr:
  120. case ResultConstants.ParamMetadata:
  121. navigator = new RowSetNavigatorClient(1);
  122. break;
  123. case ResultConstants.BatchExecResponse:
  124. navigator = new RowSetNavigatorClient(4);
  125. break;
  126. case ResultConstants.Data:
  127. case ResultConstants.DataHead:
  128. case ResultConstants.DataRows:
  129. case ResultConstants.Generated:
  130. break;
  131. case ResultConstants.LargeObjectOp:
  132. throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  133. }
  134. Result result = new Result(type) {navigator = navigator};
  135. return result;
  136. }
  137. //UNUSED CODE
  138. //public static Result NewResult(DataInputStream dataInput,
  139. // RowInputBinary input)
  140. //{
  141. // return NewResult(null, dataInput.ReadByte(), dataInput, input);
  142. //}
  143. //public static Result NewResult(Session session, int mode,
  144. // DataInputStream dataInput,
  145. // RowInputBinary input)
  146. //{
  147. // try
  148. // {
  149. // if (mode == ResultConstants.LARGE_OBJECT_OP)
  150. // {
  151. // return ResultLob.NewLob(dataInput, false);
  152. // }
  153. // Result result = NewResult(session, dataInput, input, mode);
  154. // return result;
  155. // }
  156. // catch (IOException)
  157. // {
  158. // throw Error.GetError(ErrorCode.X_08000);
  159. // }
  160. //}
  161. //UNUSED CODE
  162. //public void ReadAdditionalResults(SessionInterface session,
  163. // DataInputStream inputStream,
  164. // RowInputBinary input)
  165. //{
  166. // SetSession(session);
  167. // Result currentResult = this;
  168. // bool hasLob = false;
  169. // while (true)
  170. // {
  171. // int addedResultMode = inputStream.ReadByte();
  172. // if (addedResultMode == ResultConstants.LARGE_OBJECT_OP)
  173. // {
  174. // ResultLob resultLob = ResultLob.NewLob(inputStream, false);
  175. // if (session is Session)
  176. // {
  177. // ((Session)session).AllocateResultLob(resultLob,
  178. // inputStream);
  179. // }
  180. // currentResult.AddLobResult(resultLob);
  181. // hasLob = true;
  182. // continue;
  183. // }
  184. // if (hasLob)
  185. // {
  186. // hasLob = false;
  187. // if (session is Session)
  188. // {
  189. // ((Session)session).RegisterResultLobs(currentResult);
  190. // }
  191. // }
  192. // if (addedResultMode == ResultConstants.NONE)
  193. // {
  194. // return;
  195. // }
  196. // currentResult = NewResult(null, inputStream, input, addedResultMode);
  197. // AddChainedResult(currentResult);
  198. // }
  199. //}
  200. //UNUSED CODE
  201. //private static Result NewResult(Session session, DataInputStream dataInput,
  202. // RowInputBinary input,
  203. // int mode)
  204. //{
  205. // Result result = NewResult(mode);
  206. // int length = dataInput.ReadInt();
  207. // input.ResetRow(0, length);
  208. // byte[] byteArray = input.GetBuffer();
  209. // int offset = 4;
  210. // dataInput.ReadFully(byteArray, offset, length - offset);
  211. // switch (mode)
  212. // {
  213. // case ResultConstants.GETSESSIONATTR:
  214. // result.statementReturnType = input.ReadByte();
  215. // break;
  216. // case ResultConstants.DISCONNECT:
  217. // case ResultConstants.RESETSESSION:
  218. // case ResultConstants.STARTTRAN:
  219. // break;
  220. // case ResultConstants.PREPARE:
  221. // result.SetStatementType(input.ReadByte());
  222. // result.mainString = input.ReadString();
  223. // result.rsProperties = input.ReadByte();
  224. // result.generateKeys = input.ReadByte();
  225. // if (result.generateKeys == ResultConstants
  226. // .RETURN_GENERATED_KEYS_COL_NAMES || result
  227. // .generateKeys == ResultConstants
  228. // .RETURN_GENERATED_KEYS_COL_INDEXES)
  229. // {
  230. // result.generatedMetaData = new ResultMetaData(input);
  231. // }
  232. // break;
  233. // case ResultConstants.CLOSE_RESULT:
  234. // result.id = input.ReadLong();
  235. // break;
  236. // case ResultConstants.FREESTMT:
  237. // result.statementID = input.ReadLong();
  238. // break;
  239. // case ResultConstants.EXECDIRECT:
  240. // result.updateCount = input.ReadInt();
  241. // result.fetchSize = input.ReadInt();
  242. // result.statementReturnType = input.ReadByte();
  243. // result.mainString = input.ReadString();
  244. // result.rsProperties = input.ReadByte();
  245. // result.queryTimeout = input.ReadShort();
  246. // result.generateKeys = input.ReadByte();
  247. // if (result.generateKeys == ResultConstants
  248. // .RETURN_GENERATED_KEYS_COL_NAMES || result
  249. // .generateKeys == ResultConstants
  250. // .RETURN_GENERATED_KEYS_COL_INDEXES)
  251. // {
  252. // result.generatedMetaData = new ResultMetaData(input);
  253. // }
  254. // break;
  255. // case ResultConstants.CONNECT:
  256. // result.databaseName = input.ReadString();
  257. // result.mainString = input.ReadString();
  258. // result.subString = input.ReadString();
  259. // result.zoneString = input.ReadString();
  260. // result.updateCount = input.ReadInt();
  261. // break;
  262. // case ResultConstants.ERROR:
  263. // case ResultConstants.WARNING:
  264. // result.mainString = input.ReadString();
  265. // result.subString = input.ReadString();
  266. // result.errorCode = input.ReadInt();
  267. // break;
  268. // case ResultConstants.CONNECTACKNOWLEDGE:
  269. // result.databaseID = input.ReadInt();
  270. // result.sessionID = input.ReadLong();
  271. // result.mainString = input.ReadString();
  272. // break;
  273. // case ResultConstants.UPDATECOUNT:
  274. // result.updateCount = input.ReadInt();
  275. // break;
  276. // case ResultConstants.ENDTRAN:
  277. // {
  278. // int type = input.ReadInt();
  279. // result.SetActionType(type); // endtran type
  280. // switch (type)
  281. // {
  282. // case ResultConstants.TX_SAVEPOINT_NAME_RELEASE:
  283. // case ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK:
  284. // result.mainString = input.ReadString(); // savepoint name
  285. // break;
  286. // case ResultConstants.TX_COMMIT:
  287. // case ResultConstants.TX_ROLLBACK:
  288. // case ResultConstants.TX_COMMIT_AND_CHAIN:
  289. // case ResultConstants.TX_ROLLBACK_AND_CHAIN:
  290. // break;
  291. // default:
  292. // throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  293. // }
  294. // break;
  295. // }
  296. // case ResultConstants.SETCONNECTATTR:
  297. // {
  298. // int type = input.ReadInt(); // attr type
  299. // result.SetConnectionAttrType(type);
  300. // switch (type)
  301. // {
  302. // case ResultConstants.SQL_ATTR_SAVEPOINT_NAME:
  303. // result.mainString = input.ReadString(); // savepoint name
  304. // break;
  305. // // case ResultConstants.SQL_ATTR_AUTO_IPD :
  306. // // - always true
  307. // // default: throw - case never happens
  308. // default:
  309. // throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  310. // }
  311. // break;
  312. // }
  313. // case ResultConstants.PREPARE_ACK:
  314. // result.statementReturnType = input.ReadByte();
  315. // result.statementID = input.ReadLong();
  316. // result.rsProperties = input.ReadByte();
  317. // result.metaData = new ResultMetaData(input);
  318. // result.parameterMetaData = new ResultMetaData(input);
  319. // break;
  320. // case ResultConstants.CALL_RESPONSE:
  321. // result.updateCount = input.ReadInt();
  322. // result.fetchSize = input.ReadInt();
  323. // result.statementID = input.ReadLong();
  324. // result.rsProperties = input.ReadByte();
  325. // result.metaData = new ResultMetaData(input);
  326. // result.valueData = ReadSimple(input, result.metaData);
  327. // break;
  328. // case ResultConstants.EXECUTE:
  329. // result.updateCount = input.ReadInt();
  330. // result.fetchSize = input.ReadInt();
  331. // result.statementID = input.ReadLong();
  332. // result.rsProperties = input.ReadByte();
  333. // result.queryTimeout = input.ReadShort();
  334. // Statement statement =
  335. // session.statementManager.GetStatement(
  336. // session, result.statementID);
  337. // result.statement = statement;
  338. // if (statement != null)
  339. // {
  340. // result.metaData = result.statement.GetParametersMetaData();
  341. // }
  342. // result.valueData = ReadSimple(input, result.metaData);
  343. // break;
  344. // case ResultConstants.UPDATE_RESULT:
  345. // {
  346. // result.id = input.ReadLong();
  347. // int type = input.ReadInt();
  348. // result.SetActionType(type);
  349. // result.metaData = new ResultMetaData(input);
  350. // result.valueData = ReadSimple(input, result.metaData);
  351. // break;
  352. // }
  353. // case ResultConstants.BATCHEXECRESPONSE:
  354. // case ResultConstants.BATCHEXECUTE:
  355. // case ResultConstants.BATCHEXECDIRECT:
  356. // case ResultConstants.SETSESSIONATTR:
  357. // {
  358. // result.updateCount = input.ReadInt();
  359. // result.fetchSize = input.ReadInt();
  360. // result.statementID = input.ReadLong();
  361. // result.queryTimeout = input.ReadShort();
  362. // result.metaData = new ResultMetaData(input);
  363. // result._navigator.ReadSimple(input, result.metaData);
  364. // break;
  365. // }
  366. // case ResultConstants.PARAM_METADATA:
  367. // {
  368. // result.metaData = new ResultMetaData(input);
  369. // result._navigator.Read(input, result.metaData);
  370. // break;
  371. // }
  372. // case ResultConstants.REQUESTDATA:
  373. // {
  374. // result.id = input.ReadLong();
  375. // result.updateCount = input.ReadInt();
  376. // result.fetchSize = input.ReadInt();
  377. // break;
  378. // }
  379. // case ResultConstants.DATAHEAD:
  380. // case ResultConstants.DATA:
  381. // {
  382. // result.id = input.ReadLong();
  383. // result.updateCount = input.ReadInt();
  384. // result.fetchSize = input.ReadInt();
  385. // result.rsProperties = input.ReadByte();
  386. // result.metaData = new ResultMetaData(input);
  387. // result._navigator = new RowSetNavigatorClient();
  388. // result._navigator.Read(input, result.metaData);
  389. // break;
  390. // }
  391. // case ResultConstants.DATAROWS:
  392. // {
  393. // result.metaData = new ResultMetaData(input);
  394. // result._navigator = new RowSetNavigatorClient();
  395. // result._navigator.Read(input, result.metaData);
  396. // break;
  397. // }
  398. // default:
  399. // throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  400. // }
  401. // return result;
  402. //}
  403. /**
  404. * For interval PSM return values
  405. */
  406. public static Result NewPsmResult(int type, String label, Object value)
  407. {
  408. Result result = NewResult(ResultConstants.Value);
  409. result._errorCode = type;
  410. result._mainString = label;
  411. result.ValueData = value;
  412. return result;
  413. }
  414. /**
  415. * For interval PSM return values
  416. */
  417. public static Result NewPsmResult(Object value)
  418. {
  419. Result result = NewResult(ResultConstants.Value);
  420. result.ValueData = value;
  421. return result;
  422. }
  423. /**
  424. * For SQLPREPARE
  425. * For parparation of SQL parepared statements.
  426. */
  427. public static Result NewPrepareStatementRequest()
  428. {
  429. return NewResult(ResultConstants.Prepare);
  430. }
  431. /**
  432. * For SQLEXECUTE
  433. * For execution of SQL prepared statements.
  434. * The parameters are set afterwards as the Result is reused
  435. */
  436. public static Result NewPreparedExecuteRequest(SqlType[] types,
  437. long statementId)
  438. {
  439. Result result = NewResult(ResultConstants.Execute);
  440. result.MetaData = ResultMetaData.NewSimpleResultMetaData(types);
  441. result._statementId = statementId;
  442. result.ValueData = new object[0];
  443. return result;
  444. }
  445. /**
  446. * For CALL_RESPONSE
  447. * For execution of SQL callable statements.
  448. */
  449. public static Result NewCallResponse(SqlType[] types, long statementId,
  450. Object[] values)
  451. {
  452. Result result = NewResult(ResultConstants.CallResponse);
  453. result.MetaData = ResultMetaData.NewSimpleResultMetaData(types);
  454. result._statementId = statementId;
  455. result.ValueData = values;
  456. return result;
  457. }
  458. /**
  459. * For UPDATE_RESULT
  460. * The parameters are set afterwards as the Result is reused
  461. */
  462. public static Result NewUpdateResultRequest(SqlType[] types, long id)
  463. {
  464. Result result = NewResult(ResultConstants.UpdateResult);
  465. result.MetaData = ResultMetaData.NewUpdateResultMetaData(types);
  466. result._id = id;
  467. result.ValueData = new Object[] {};
  468. return result;
  469. }
  470. /**
  471. * For UPDATE_RESULT results
  472. * The parameters are set by this method as the Result is reused
  473. */
  474. public void SetPreparedResultUpdateProperties(Object[] parameterValues)
  475. {
  476. ValueData = parameterValues;
  477. }
  478. /**
  479. * For SQLEXECUTE results
  480. * The parameters are set by this method as the Result is reused
  481. */
  482. public void SetPreparedExecuteProperties(Object[] parameterValues,
  483. int maxRows, int fetchSize, int resultProps)
  484. {
  485. Mode = ResultConstants.Execute;
  486. ValueData = parameterValues;
  487. UpdateCount = maxRows;
  488. _fetchSize = fetchSize;
  489. RsProperties = resultProps;
  490. }
  491. /**
  492. * For BATCHEXECUTE
  493. */
  494. //UNUSED CODE
  495. //public void SetBatchedPreparedExecuteRequest()
  496. //{
  497. // mode = ResultConstants.BATCHEXECUTE;
  498. // if (_navigator == null)
  499. // {
  500. // _navigator = new RowSetNavigatorClient(4);
  501. // }
  502. // else
  503. // {
  504. // ((RowSetNavigatorClient)_navigator).Clear();
  505. // }
  506. // updateCount = 0;
  507. // this.fetchSize = 0;
  508. //}
  509. //UNUSED CODE
  510. //public void AddBatchedPreparedExecuteRequest(Object[] parameterValues)
  511. //{
  512. // ((RowSetNavigatorClient)_navigator).Add(parameterValues);
  513. //}
  514. /**
  515. * For BATCHEXECDIRECT
  516. */
  517. public static Result NewBatchedExecuteRequest()
  518. {
  519. var types = new SqlType[] {SqlType.SqlVarchar};
  520. Result result = NewResult(ResultConstants.BatchExecDirect);
  521. result.MetaData = ResultMetaData.NewSimpleResultMetaData(types);
  522. return result;
  523. }
  524. /**
  525. * For BATCHEXERESPONSE for a BATCHEXECUTE or BATCHEXECDIRECT
  526. */
  527. public static Result NewBatchedExecuteResponse(int[] updateCounts,
  528. Result generatedResult, Result e)
  529. {
  530. Result result = NewResult(ResultConstants.BatchExecResponse);
  531. result.AddChainedResult(generatedResult);
  532. result.AddChainedResult(e);
  533. var types = new SqlType[] {SqlType.SqlInteger};
  534. result.MetaData = ResultMetaData.NewSimpleResultMetaData(types);
  535. var table = new Object[updateCounts.Length][];
  536. for (int i = 0; i < updateCounts.Length; i++)
  537. {
  538. table[i] = new Object[] {updateCounts[i]};
  539. }
  540. ((RowSetNavigatorClient) result.navigator).SetData(table);
  541. return result;
  542. }
  543. //UNUSED CODE
  544. //public static Result NewResetSessionRequest()
  545. //{
  546. // Result result = NewResult(ResultConstants.RESETSESSION);
  547. // return result;
  548. //}
  549. //UNUSED CODE
  550. //public static Result NewConnectionAttemptRequest(String user,
  551. // String password, String database, String zoneString,
  552. // int timeZoneSeconds)
  553. //{
  554. // Result result = NewResult(ResultConstants.CONNECT);
  555. // result.mainString = user;
  556. // result.subString = password;
  557. // result.zoneString = zoneString;
  558. // result.databaseName = database;
  559. // result.updateCount = timeZoneSeconds;
  560. // return result;
  561. //}
  562. //UNUSED CODE
  563. //public static Result NewConnectionAcknowledgeResponse(Database database, long sessionID,
  564. // int databaseID)
  565. //{
  566. // Result result = NewResult(ResultConstants.CONNECTACKNOWLEDGE);
  567. // result.sessionID = sessionID;
  568. // result.databaseID = databaseID;
  569. // result.mainString =
  570. // database.GetProperties().GetClientPropertiesAsString();
  571. // return result;
  572. //}
  573. public static Result NewUpdateZeroResult()
  574. {
  575. return new Result(ResultConstants.Updatecount, 0);
  576. }
  577. public static Result NewUpdateCountResult(int count)
  578. {
  579. return new Result(ResultConstants.Updatecount, count);
  580. }
  581. public static Result NewUpdateCountResult(ResultMetaData meta, int count)
  582. {
  583. Result result = NewResult(ResultConstants.Updatecount);
  584. Result dataResult = NewGeneratedDataResult(meta);
  585. result.UpdateCount = count;
  586. result.AddChainedResult(dataResult);
  587. return result;
  588. }
  589. public static Result NewSingleColumnResult(ResultMetaData meta)
  590. {
  591. Result result = NewResult(ResultConstants.Data);
  592. result.MetaData = meta;
  593. result.navigator = new RowSetNavigatorClient();
  594. return result;
  595. }
  596. public static Result NewSingleColumnResult(String colName, SqlType type)
  597. {
  598. Result result = NewResult(ResultConstants.Data);
  599. result.MetaData = ResultMetaData.NewResultMetaData(1);
  600. result.MetaData.columns[0] = new ColumnBase(null, null, null, colName);
  601. result.MetaData.columns[0].SetType(type);
  602. result.MetaData.PrepareData();
  603. //
  604. result.navigator = new RowSetNavigatorClient(8);
  605. return result;
  606. }
  607. public static Result NewSingleColumnStringResult(String colName,
  608. String contents)
  609. {
  610. Result result = NewSingleColumnResult("OPERATION",
  611. SqlType.SqlVarchar);
  612. using (var lnr = new StringReader(contents))
  613. {
  614. while (true)
  615. {
  616. String line = null;
  617. try
  618. {
  619. line = lnr.ReadLine();
  620. }
  621. catch (Exception)
  622. {
  623. }
  624. if (line == null)
  625. {
  626. break;
  627. }
  628. result.GetNavigator().Add(new Object[] {line});
  629. }
  630. }
  631. return result;
  632. }
  633. internal static Result NewPrepareResponse(Statement statement)
  634. {
  635. Result r = NewResult(ResultConstants.PrepareAck);
  636. r.statement = statement;
  637. r._statementId = statement.GetId();
  638. int csType = statement.GetStatementType();
  639. r._statementReturnType =
  640. (csType == StatementTypes.SELECT_CURSOR || csType == StatementTypes
  641. .CALL)
  642. ? StatementTypes.RETURN_RESULT
  643. : StatementTypes.RETURN_COUNT;
  644. r.MetaData = statement.GetResultMetaData();
  645. r.ParameterMetaData = statement.GetParametersMetaData();
  646. return r;
  647. }
  648. public static Result NewFreeStmtRequest(long statementId)
  649. {
  650. Result r = NewResult(ResultConstants.FreeStmt);
  651. r._statementId = statementId;
  652. return r;
  653. }
  654. /**
  655. * For direct execution of SQL statements. The statement and other
  656. * parameters are set afterwards as the Result is reused
  657. */
  658. public static Result NewExecuteDirectRequest()
  659. {
  660. return NewResult(ResultConstants.ExecDirect);
  661. }
  662. /**
  663. * For both EXECDIRECT and PREPARE
  664. */
  665. public void SetPrepareOrExecuteProperties(String sql, int maxRows,
  666. int fetchSize, int statementReturnType, int timeout,
  667. int resultSetProperties, int keyMode, int[] generatedIndexes,
  668. String[] generatedNames)
  669. {
  670. _mainString = sql;
  671. UpdateCount = maxRows;
  672. _fetchSize = fetchSize;
  673. _statementReturnType = statementReturnType;
  674. QueryTimeout = timeout;
  675. RsProperties = resultSetProperties;
  676. _generateKeys = keyMode;
  677. GeneratedMetaData =
  678. ResultMetaData.NewGeneratedColumnsMetaData(generatedIndexes,
  679. generatedNames);
  680. }
  681. public void SetGeneratedKeys(int[] generatedIndexes, String[] generatedNames)
  682. {
  683. _generateKeys = ResultConstants.ReturnGeneratedKeys;
  684. GeneratedMetaData =
  685. ResultMetaData.NewGeneratedColumnsMetaData(generatedIndexes,
  686. generatedNames);
  687. }
  688. public static Result NewSetSavepointRequest(String name)
  689. {
  690. Result result = NewResult(ResultConstants.SetconnectAttr);
  691. result.SetConnectionAttrType(ResultConstants.SqlAttrSavepointName);
  692. result.SetMainString(name);
  693. return result;
  694. }
  695. public static Result NewRequestDataResult(long id, int offset, int count)
  696. {
  697. Result result = NewResult(ResultConstants.RequestData);
  698. result._id = id;
  699. result.UpdateCount = offset;
  700. result._fetchSize = count;
  701. return result;
  702. }
  703. public static Result NewDataResult(ResultMetaData md)
  704. {
  705. Result result = NewResult(ResultConstants.Data);
  706. result.navigator = new RowSetNavigatorClient();
  707. result.MetaData = md;
  708. return result;
  709. }
  710. public static Result NewGeneratedDataResult(ResultMetaData md)
  711. {
  712. Result result = NewResult(ResultConstants.Generated);
  713. result.navigator = new RowSetNavigatorClient();
  714. result.MetaData = md;
  715. return result;
  716. }
  717. /**
  718. * initially, only used for updatability
  719. */
  720. public int GetExecuteProperties()
  721. {
  722. return RsProperties;
  723. }
  724. /**
  725. * For DATA
  726. */
  727. public void SetDataResultProperties(int maxRows, int fetchSize,
  728. int resultSetScrollability,
  729. int resultSetConcurrency,
  730. int resultSetHoldability)
  731. {
  732. UpdateCount = maxRows;
  733. _fetchSize = fetchSize;
  734. RsProperties = ResultProperties.GetValueForAdo(
  735. resultSetScrollability,
  736. resultSetConcurrency,
  737. resultSetHoldability);
  738. }
  739. public static Result NewDataHeadResult(ISessionInterface session,
  740. Result source, int offset,
  741. int count)
  742. {
  743. if (offset + count > source.navigator.GetSize())
  744. {
  745. count = source.navigator.GetSize() - offset;
  746. }
  747. Result result = NewResult(ResultConstants.DataHead);
  748. result.MetaData = source.MetaData;
  749. result.navigator = new RowSetNavigatorClient(source.navigator, offset,
  750. count);
  751. result.navigator.SetId(source.navigator.GetId());
  752. result.SetSession(session);
  753. result.RsProperties = source.RsProperties;
  754. result._fetchSize = source._fetchSize;
  755. return result;
  756. }
  757. public static Result NewDataRowsResult(Result source, int offset,
  758. int count)
  759. {
  760. if (offset + count > source.navigator.GetSize())
  761. {
  762. count = source.navigator.GetSize() - offset;
  763. }
  764. Result result = NewResult(ResultConstants.DataRows);
  765. result._id = source._id;
  766. result.MetaData = source.MetaData;
  767. result.navigator = new RowSetNavigatorClient(source.navigator, offset,
  768. count);
  769. return result;
  770. }
  771. public static Result NewDataRowsResult(RowSetNavigator navigator)
  772. {
  773. Result result = NewResult(ResultConstants.DataRows);
  774. result.navigator = navigator;
  775. return result;
  776. }
  777. /**
  778. * Result structure used for set/get session attributes
  779. */
  780. public static Result NewSessionAttributesResult()
  781. {
  782. Result result = NewResult(ResultConstants.Data);
  783. result.navigator = new RowSetNavigatorClient(1);
  784. result.MetaData = SessionAttributesMetaData;
  785. result.navigator.Add(new Object[SessionInfoTypeConsts.InfoLimit]);
  786. return result;
  787. }
  788. public static Result NewWarningResult(CoreException w)
  789. {
  790. Result result = NewResult(ResultConstants.Warning);
  791. result._mainString = w.GetMessage();
  792. result._subString = w.GetSqlState();
  793. result._errorCode = w.GetErrorCode();
  794. return result;
  795. }
  796. public static Result NewErrorResult(Exception t)
  797. {
  798. return NewErrorResult(t, null);
  799. }
  800. /** @todo 1.9.0 fredt - move the messages to Error.java */
  801. public static Result NewErrorResult(Exception t, String statement)
  802. {
  803. Result result = NewResult(ResultConstants.Error);
  804. CoreException tExp = t as CoreException;
  805. if (tExp != null)
  806. {
  807. result._exception = tExp;
  808. result._mainString = result._exception.GetMessage();
  809. result._subString = result._exception.GetSqlState();
  810. if (statement != null)
  811. {
  812. result._mainString += " in statement [" + statement + "]";
  813. }
  814. result._errorCode = result._exception.GetErrorCode();
  815. }
  816. else if (t is OutOfMemoryException)
  817. {
  818. // gc() at this point may clear the memory allocated so far
  819. /** @todo 1.9.0 - review if it's better to gc higher up the stack */
  820. //System.GC.Collect();
  821. result._exception = Error.GetError(ErrorCode.OUT_OF_MEMORY, t);
  822. result._mainString = result._exception.GetMessage();
  823. result._subString = result._exception.GetSqlState();
  824. result._errorCode = result._exception.GetErrorCode();
  825. }
  826. else
  827. {
  828. result._exception = Error.GetError(ErrorCode.GENERAL_ERROR, t);
  829. result._mainString = result._exception.GetMessage() + " "
  830. + t.Message;
  831. result._subString = result._exception.GetSqlState();
  832. result._errorCode = result._exception.GetErrorCode();
  833. if (statement != null)
  834. {
  835. result._mainString += " in statement [" + statement + "]";
  836. }
  837. }
  838. return result;
  839. }
  840. //UNUSED CODE
  841. //public virtual void Write(Stream dataOut,
  842. // RowOutputInterface rowOut)
  843. //{
  844. // rowOut.Reset();
  845. // rowOut.WriteByte(mode);
  846. // int startPos = rowOut.Size();
  847. // rowOut.WriteSize(0);
  848. // switch (mode)
  849. // {
  850. // case ResultConstants.GETSESSIONATTR:
  851. // rowOut.WriteByte((byte)statementReturnType);
  852. // break;
  853. // case ResultConstants.DISCONNECT:
  854. // case ResultConstants.RESETSESSION:
  855. // case ResultConstants.STARTTRAN:
  856. // break;
  857. // case ResultConstants.PREPARE:
  858. // rowOut.WriteByte((byte)statementReturnType);
  859. // rowOut.WriteString(mainString);
  860. // rowOut.WriteByte(rsProperties);
  861. // rowOut.WriteByte((byte)generateKeys);
  862. // if (generateKeys == ResultConstants
  863. // .RETURN_GENERATED_KEYS_COL_NAMES || generateKeys == ResultConstants
  864. // .RETURN_GENERATED_KEYS_COL_INDEXES)
  865. // {
  866. // generatedMetaData.write(rowOut);
  867. // }
  868. // break;
  869. // case ResultConstants.FREESTMT:
  870. // rowOut.WriteLong(statementID);
  871. // break;
  872. // case ResultConstants.CLOSE_RESULT:
  873. // rowOut.WriteLong(id);
  874. // break;
  875. // case ResultConstants.EXECDIRECT:
  876. // rowOut.WriteInt(updateCount);
  877. // rowOut.WriteInt(fetchSize);
  878. // rowOut.WriteByte((byte)statementReturnType);
  879. // rowOut.WriteString(mainString);
  880. // rowOut.WriteByte(rsProperties);
  881. // rowOut.WriteShort((short)queryTimeout);
  882. // rowOut.WriteByte((byte)generateKeys);
  883. // if (generateKeys == ResultConstants
  884. // .RETURN_GENERATED_KEYS_COL_NAMES || generateKeys == ResultConstants
  885. // .RETURN_GENERATED_KEYS_COL_INDEXES)
  886. // {
  887. // generatedMetaData.write(rowOut);
  888. // }
  889. // break;
  890. // case ResultConstants.CONNECT:
  891. // rowOut.WriteString(databaseName);
  892. // rowOut.WriteString(mainString);
  893. // rowOut.WriteString(subString);
  894. // rowOut.WriteString(zoneString);
  895. // rowOut.WriteInt(updateCount);
  896. // break;
  897. // case ResultConstants.ERROR:
  898. // case ResultConstants.WARNING:
  899. // rowOut.WriteString(mainString);
  900. // rowOut.WriteString(subString);
  901. // rowOut.WriteInt(errorCode);
  902. // break;
  903. // case ResultConstants.CONNECTACKNOWLEDGE:
  904. // rowOut.WriteInt(databaseID);
  905. // rowOut.WriteLong(sessionID);
  906. // rowOut.WriteString(mainString);
  907. // break;
  908. // case ResultConstants.UPDATECOUNT:
  909. // rowOut.WriteInt(updateCount);
  910. // break;
  911. // case ResultConstants.ENDTRAN:
  912. // {
  913. // int type = GetActionType();
  914. // rowOut.WriteInt(type); // endtran type
  915. // switch (type)
  916. // {
  917. // case ResultConstants.TX_SAVEPOINT_NAME_RELEASE:
  918. // case ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK:
  919. // rowOut.WriteString(mainString); // savepoint name
  920. // break;
  921. // case ResultConstants.TX_COMMIT:
  922. // case ResultConstants.TX_ROLLBACK:
  923. // case ResultConstants.TX_COMMIT_AND_CHAIN:
  924. // case ResultConstants.TX_ROLLBACK_AND_CHAIN:
  925. // break;
  926. // default:
  927. // throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  928. // }
  929. // break;
  930. // }
  931. // case ResultConstants.PREPARE_ACK:
  932. // rowOut.WriteByte((byte)statementReturnType);
  933. // rowOut.WriteLong(statementID);
  934. // rowOut.WriteByte(rsProperties);
  935. // metaData.write(rowOut);
  936. // parameterMetaData.write(rowOut);
  937. // break;
  938. // case ResultConstants.CALL_RESPONSE:
  939. // rowOut.WriteInt(updateCount);
  940. // rowOut.WriteInt(fetchSize);
  941. // rowOut.WriteLong(statementID);
  942. // rowOut.WriteByte(rsProperties);
  943. // metaData.write(rowOut);
  944. // WriteSimple(rowOut,metaData, (Object[])valueData);
  945. // break;
  946. // case ResultConstants.EXECUTE:
  947. // rowOut.WriteInt(updateCount);
  948. // rowOut.WriteInt(fetchSize);
  949. // rowOut.WriteLong(statementID);
  950. // rowOut.WriteByte(rsProperties);
  951. // rowOut.WriteShort((short)queryTimeout);
  952. // WriteSimple(rowOut, metaData, (Object[])valueData);
  953. // break;
  954. // case ResultConstants.UPDATE_RESULT:
  955. // rowOut.WriteLong(id);
  956. // rowOut.WriteInt(GetActionType());
  957. // metaData.write(rowOut);
  958. // WriteSimple(rowOut, metaData, (Object[])valueData);
  959. // break;
  960. // case ResultConstants.BATCHEXECRESPONSE:
  961. // case ResultConstants.BATCHEXECUTE:
  962. // case ResultConstants.BATCHEXECDIRECT:
  963. // case ResultConstants.SETSESSIONATTR:
  964. // {
  965. // rowOut.WriteInt(updateCount);
  966. // rowOut.WriteInt(fetchSize);
  967. // rowOut.WriteLong(statementID);
  968. // rowOut.WriteShort((short)queryTimeout);
  969. // metaData.write(rowOut);
  970. // _navigator.WriteSimple(rowOut, metaData);
  971. // break;
  972. // }
  973. // case ResultConstants.PARAM_METADATA:
  974. // {
  975. // metaData.write(rowOut);
  976. // _navigator.Write(rowOut, metaData);
  977. // break;
  978. // }
  979. // case ResultConstants.SETCONNECTATTR:
  980. // {
  981. // int type = GetConnectionAttrType();
  982. // rowOut.WriteInt(type); // attr type / updateCount
  983. // switch (type)
  984. // {
  985. // case ResultConstants.SQL_ATTR_SAVEPOINT_NAME:
  986. // rowOut.WriteString(mainString); // savepoint name
  987. // break;
  988. // // case ResultConstants.SQL_ATTR_AUTO_IPD // always true
  989. // // default: // throw, but case never happens
  990. // default:
  991. // throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  992. // }
  993. // break;
  994. // }
  995. // case ResultConstants.REQUESTDATA:
  996. // {
  997. // rowOut.WriteLong(id);
  998. // rowOut.WriteInt(updateCount);
  999. // rowOut.WriteInt(fetchSize);
  1000. // break;
  1001. // }
  1002. // case ResultConstants.DATAROWS:
  1003. // metaData.write(rowOut);
  1004. // _navigator.Write(rowOut, metaData);
  1005. // break;
  1006. // case ResultConstants.DATAHEAD:
  1007. // case ResultConstants.DATA:
  1008. // rowOut.WriteLong(id);
  1009. // rowOut.WriteInt(updateCount);
  1010. // rowOut.WriteInt(fetchSize);
  1011. // rowOut.WriteByte(rsProperties);
  1012. // metaData.write(rowOut);
  1013. // _navigator.Write(rowOut, metaData);
  1014. // break;
  1015. // default:
  1016. // throw Error.RuntimeError(ErrorCode.U_S0500, "Result");
  1017. // }
  1018. // rowOut.WriteIntData(rowOut.Size() - startPos, startPos);
  1019. // dataOut.Write(rowOut.GetOutputStream().GetBuffer(), 0, rowOut.Size());
  1020. // int count = GetLobCount();
  1021. // Result current = this;
  1022. // for (int i = 0; i < count; i++)
  1023. // {
  1024. // ResultLob lob = current.lobResults;
  1025. // lob.WriteBody(new DataOutputStream(dataOut));
  1026. // current = current.lobResults;
  1027. // }
  1028. // if (chainedResult == null)
  1029. // {
  1030. // dataOut.WriteByte(ResultConstants.NONE);
  1031. // }
  1032. // else
  1033. // {
  1034. // chainedResult.Write(dataOut, rowOut);
  1035. // }
  1036. // dataOut.Flush();
  1037. //}
  1038. public int GetResultType()
  1039. {
  1040. return Mode;
  1041. }
  1042. public bool IsData()
  1043. {
  1044. return Mode == ResultConstants.Data
  1045. || Mode == ResultConstants.DataHead;
  1046. }
  1047. public bool IsError()
  1048. {
  1049. return Mode == ResultConstants.Error;
  1050. }
  1051. public bool IsWarning()
  1052. {
  1053. return Mode == ResultConstants.Warning;
  1054. }
  1055. public bool IsUpdateCount()
  1056. {
  1057. return Mode == ResultConstants.Updatecount;
  1058. }
  1059. public bool IsSimpleValue()
  1060. {
  1061. return Mode == ResultConstants.Value;
  1062. }
  1063. public bool HasGeneratedKeys()
  1064. {
  1065. return Mode == ResultConstants.Updatecount && _chainedResult != null;
  1066. }
  1067. public CoreException GetException()
  1068. {
  1069. return _exception;
  1070. }
  1071. public long GetStatementId()
  1072. {
  1073. return _statementId;
  1074. }
  1075. public void SetStatementId(long statementId)
  1076. {
  1077. _statementId = statementId;
  1078. }
  1079. public String GetMainString()
  1080. {
  1081. return _mainString;
  1082. }
  1083. public void SetMainString(String sql)
  1084. {
  1085. _mainString = sql;
  1086. }
  1087. public String GetSubString()
  1088. {
  1089. return _subString;
  1090. }
  1091. public String GetZoneString()
  1092. {
  1093. return _zoneString;
  1094. }
  1095. public int GetErrorCode()
  1096. {
  1097. return _errorCode;
  1098. }
  1099. public Object GetValueObject()
  1100. {
  1101. return ValueData;
  1102. }
  1103. public void SetValueObject(Object value)
  1104. {
  1105. ValueData = value;
  1106. }
  1107. internal Statement GetStatement()
  1108. {
  1109. return statement;
  1110. }
  1111. internal void SetStatement(Statement statement)
  1112. {
  1113. this.statement = statement;
  1114. }
  1115. public String GetDatabaseName()
  1116. {
  1117. return _databaseName;
  1118. }
  1119. public void SetMaxRows(int count)
  1120. {
  1121. UpdateCount = count;
  1122. }
  1123. public int GetFetchSize()
  1124. {
  1125. return _fetchSize;
  1126. }
  1127. public void SetFetchSize(int count)
  1128. {
  1129. _fetchSize = count;
  1130. }
  1131. public int GetUpdateCount()
  1132. {
  1133. return UpdateCount;

Large files files are truncated, but you can click here to view the full file