ReaderCache.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. //
  2. // System.Data.ProviderBase.ReaderCache.cs
  3. //
  4. // Authors:
  5. // Konstantin Triger <[email protected]>
  6. // Boris Kirzner <[email protected]>
  7. //
  8. // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
  9. //
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using System;
  31. using java.sql;
  32. namespace System.Data.Common
  33. {
  34. public interface IReaderCacheContainer
  35. {
  36. void Fetch(ResultSet rs, int columnIndex);
  37. bool IsNull();
  38. object GetValue();
  39. }
  40. internal abstract class ReaderCacheContainerBase : IReaderCacheContainer
  41. {
  42. #region Fields
  43. bool _isNull;
  44. #endregion // Fields
  45. #region Methods
  46. protected abstract void FetchInternal(ResultSet rs, int columnIndex);
  47. public abstract object GetValue();
  48. public void Fetch(ResultSet rs, int columnIndex)
  49. {
  50. FetchInternal(rs, columnIndex + 1);
  51. _isNull = rs.wasNull();
  52. }
  53. public bool IsNull()
  54. {
  55. return _isNull;
  56. }
  57. #endregion // Methods
  58. }
  59. internal sealed class ArrayReaderCacheContainer : ReaderCacheContainerBase // Types.ARRAY
  60. {
  61. #region Fields
  62. java.sql.Array _a;
  63. #endregion // Fields
  64. #region Methods
  65. protected override void FetchInternal(ResultSet rs, int columnIndex)
  66. {
  67. _a = rs.getArray(columnIndex);
  68. }
  69. public override object GetValue()
  70. {
  71. return _a;
  72. }
  73. internal java.sql.Array GetArray()
  74. {
  75. return _a;
  76. }
  77. #endregion // Methods
  78. }
  79. internal sealed class Int64ReaderCacheContainer : ReaderCacheContainerBase // Types.BIGINT
  80. {
  81. #region Fields
  82. long _l;
  83. #endregion // Fields
  84. #region Methods
  85. protected override void FetchInternal(ResultSet rs, int columnIndex)
  86. {
  87. _l = rs.getLong(columnIndex);
  88. }
  89. public override object GetValue()
  90. {
  91. return _l;
  92. }
  93. internal long GetInt64()
  94. {
  95. return _l;
  96. }
  97. #endregion // Methods
  98. }
  99. internal class BytesReaderCacheContainer : ReaderCacheContainerBase // Types.BINARY, Types.VARBINARY, Types.LONGVARBINARY
  100. {
  101. #region Fields
  102. protected byte[] _b;
  103. #endregion // Fields
  104. #region Methods
  105. protected override void FetchInternal(ResultSet rs, int columnIndex)
  106. {
  107. sbyte[] sbyteArray = rs.getBytes(columnIndex);
  108. if (sbyteArray != null) {
  109. _b = (byte[])vmw.common.TypeUtils.ToByteArray(sbyteArray);
  110. }
  111. }
  112. public override object GetValue()
  113. {
  114. return _b;
  115. }
  116. internal byte[] GetBytes()
  117. {
  118. return _b;
  119. }
  120. #endregion // Methods
  121. }
  122. internal sealed class BooleanReaderCacheContainer : ReaderCacheContainerBase // Types.BIT
  123. {
  124. #region Fields
  125. bool _b;
  126. #endregion // Fields
  127. #region Methods
  128. protected override void FetchInternal(ResultSet rs, int columnIndex)
  129. {
  130. _b = rs.getBoolean(columnIndex);
  131. }
  132. public override object GetValue()
  133. {
  134. return _b;
  135. }
  136. internal bool GetBoolean()
  137. {
  138. return _b;
  139. }
  140. #endregion // Methods
  141. }
  142. internal sealed class BlobReaderCacheContainer : BytesReaderCacheContainer // Types.BLOB
  143. {
  144. #region Fields
  145. static readonly byte[] _emptyByteArr = new byte[0];
  146. #endregion // Fields
  147. #region Methods
  148. protected override void FetchInternal(ResultSet rs, int columnIndex)
  149. {
  150. java.sql.Blob blob = rs.getBlob(columnIndex);
  151. if (blob != null) {
  152. long length = blob.length();
  153. if (length == 0) {
  154. _b = _emptyByteArr;
  155. }
  156. else {
  157. java.io.InputStream input = blob.getBinaryStream();
  158. byte[] byteValue = new byte[length];
  159. sbyte[] sbyteValue = vmw.common.TypeUtils.ToSByteArray(byteValue);
  160. input.read(sbyteValue);
  161. _b = byteValue;
  162. }
  163. }
  164. }
  165. public override object GetValue()
  166. {
  167. return _b;
  168. }
  169. #endregion // Methods
  170. }
  171. internal abstract class CharsReaderCacheContainer : ReaderCacheContainerBase //
  172. {
  173. #region Fields
  174. #endregion // Fields
  175. #region Methods
  176. internal abstract char[] GetChars();
  177. #endregion // Methods
  178. }
  179. internal sealed class GuidReaderCacheContainer : ReaderCacheContainerBase // Types.CHAR
  180. {
  181. #region Fields
  182. Guid _g;
  183. #endregion // Fields
  184. #region Methods
  185. protected override void FetchInternal(ResultSet rs, int columnIndex)
  186. {
  187. _g = new Guid(rs.getString(columnIndex));
  188. }
  189. public override object GetValue()
  190. {
  191. return _g;
  192. }
  193. internal Guid GetGuid()
  194. {
  195. return _g;
  196. }
  197. #endregion // Methods
  198. }
  199. internal sealed class ClobReaderCacheContainer : StringReaderCacheContainer // Types.CLOB
  200. {
  201. #region Fields
  202. char[] _c;
  203. #endregion // Fields
  204. #region Methods
  205. // FIXME : conside adding stream wrapper interface
  206. protected override void FetchInternal(ResultSet rs, int columnIndex)
  207. {
  208. java.sql.Clob clob = rs.getClob(columnIndex);
  209. if (clob != null) {
  210. long length = clob.length();
  211. if (length == 0) {
  212. _s = String.Empty;
  213. _c = String.Empty.ToCharArray();
  214. }
  215. else {
  216. java.io.Reader reader = clob.getCharacterStream();
  217. char[] charValue = new char[length];
  218. reader.read(charValue);
  219. _c = charValue;
  220. }
  221. }
  222. }
  223. public override object GetValue()
  224. {
  225. if (_s == null && _c != null) {
  226. _s = (_c.Length != 0) ? new String(_c) : String.Empty;
  227. }
  228. return _s;
  229. }
  230. internal override char[] GetChars()
  231. {
  232. return _c;
  233. }
  234. #endregion // Methods
  235. }
  236. internal sealed class TimeSpanReaderCacheContainer : ReaderCacheContainerBase // Types.TIME
  237. {
  238. #region Fields
  239. TimeSpan _t;
  240. #endregion // Fields
  241. #region Methods
  242. protected override void FetchInternal(ResultSet rs, int columnIndex)
  243. {
  244. Time t = rs.getTime(columnIndex);
  245. if (t != null) {
  246. _t = new TimeSpan(DbConvert.JavaTimeToClrTicks(t));
  247. }
  248. }
  249. public override object GetValue()
  250. {
  251. return _t;
  252. }
  253. internal TimeSpan GetTimeSpan()
  254. {
  255. return _t;
  256. }
  257. #endregion // Methods
  258. }
  259. internal class DateTimeReaderCacheContainer : ReaderCacheContainerBase // Types.TIMESTAMP
  260. {
  261. #region Fields
  262. protected DateTime _d;
  263. #endregion // Fields
  264. #region Methods
  265. protected override void FetchInternal(ResultSet rs, int columnIndex)
  266. {
  267. Date d = rs.getDate(columnIndex);
  268. if (d != null) {
  269. _d = new DateTime(DbConvert.JavaDateToClrTicks(d));
  270. }
  271. }
  272. public override object GetValue()
  273. {
  274. return _d;
  275. }
  276. internal DateTime GetDateTime()
  277. {
  278. return _d;
  279. }
  280. #endregion // Methods
  281. }
  282. internal sealed class TimestampReaderCacheContainer : DateTimeReaderCacheContainer // Types.DATE
  283. {
  284. protected override void FetchInternal(ResultSet rs, int columnIndex) {
  285. Timestamp ts = rs.getTimestamp(columnIndex);
  286. if (ts != null) {
  287. _d = new DateTime(DbConvert.JavaTimestampToClrTicks(ts));
  288. }
  289. }
  290. }
  291. internal sealed class DecimalReaderCacheContainer : ReaderCacheContainerBase // Types.DECIMAL, Types.NUMERIC
  292. {
  293. #region Fields
  294. decimal _d;
  295. #endregion // Fields
  296. #region Methods
  297. protected override void FetchInternal(ResultSet rs, int columnIndex)
  298. {
  299. java.math.BigDecimal bigDecimal = rs.getBigDecimal(columnIndex);
  300. if (bigDecimal != null) {
  301. _d = (decimal)vmw.common.PrimitiveTypeUtils.BigDecimalToDecimal(bigDecimal);
  302. }
  303. }
  304. public override object GetValue()
  305. {
  306. return _d;
  307. }
  308. internal decimal GetDecimal()
  309. {
  310. return _d;
  311. }
  312. #endregion // Methods
  313. }
  314. internal sealed class DoubleReaderCacheContainer : ReaderCacheContainerBase // Types.DOUBLE, Types.Float, Types.NUMERIC for Oracle with scale = -127
  315. {
  316. #region Fields
  317. double _d;
  318. #endregion // Fields
  319. #region Methods
  320. protected override void FetchInternal(ResultSet rs, int columnIndex)
  321. {
  322. _d = rs.getDouble(columnIndex);
  323. }
  324. public override object GetValue()
  325. {
  326. return _d;
  327. }
  328. internal double GetDouble()
  329. {
  330. return _d;
  331. }
  332. #endregion // Methods
  333. }
  334. internal sealed class Int32ReaderCacheContainer : ReaderCacheContainerBase // Types.INTEGER
  335. {
  336. #region Fields
  337. int _i;
  338. #endregion // Fields
  339. #region Methods
  340. protected override void FetchInternal(ResultSet rs, int columnIndex)
  341. {
  342. _i = rs.getInt(columnIndex);
  343. }
  344. public override object GetValue()
  345. {
  346. return _i;
  347. }
  348. internal int GetInt32()
  349. {
  350. return _i;
  351. }
  352. #endregion // Methods
  353. }
  354. internal class StringReaderCacheContainer : CharsReaderCacheContainer // Types.LONGVARCHAR, Types.VARCHAR, Types.CHAR
  355. {
  356. #region Fields
  357. protected string _s;
  358. #endregion // Fields
  359. #region Methods
  360. protected override void FetchInternal(ResultSet rs, int columnIndex)
  361. {
  362. _s = rs.getString(columnIndex);
  363. // Oracle Jdbc driver returns extra trailing 0 chars for NCHAR columns
  364. // if ((_s != null) && (_jdbcType == 1)) {
  365. // Console.WriteLine(_jdbcType);
  366. // int zeroIndex = ((string)_s).IndexOf((char)0);
  367. // if (zeroIndex > 0) {
  368. // Console.WriteLine("zero-padded");
  369. // _s = ((string)_s).Substring(0,zeroIndex);
  370. // }
  371. // else {
  372. // // Oracle sometimes pads with blanks (32)
  373. // int blankIndex = ((string)_s).IndexOf((char)32);
  374. // if (blankIndex > 0) {
  375. // Console.WriteLine("blank-padded");
  376. // _s = ((string)_s).Substring(0,blankIndex);
  377. // }
  378. // }
  379. // }
  380. }
  381. public override object GetValue()
  382. {
  383. return _s;
  384. }
  385. internal string GetString()
  386. {
  387. return _s;
  388. }
  389. internal override char[] GetChars()
  390. {
  391. return _s.ToCharArray();
  392. }
  393. #endregion // Methods
  394. }
  395. internal sealed class NullReaderCacheContainer : ReaderCacheContainerBase // Types.NULL
  396. {
  397. #region Fields
  398. #endregion // Fields
  399. #region Methods
  400. protected override void FetchInternal(ResultSet rs, int columnIndex)
  401. {
  402. }
  403. public override object GetValue()
  404. {
  405. return DBNull.Value;
  406. }
  407. #endregion // Methods
  408. }
  409. internal sealed class FloatReaderCacheContainer : ReaderCacheContainerBase // Types.REAL
  410. {
  411. #region Fields
  412. float _f;
  413. #endregion // Fields
  414. #region Methods
  415. protected override void FetchInternal(ResultSet rs, int columnIndex)
  416. {
  417. _f = rs.getFloat(columnIndex);
  418. }
  419. public override object GetValue()
  420. {
  421. return _f;
  422. }
  423. internal float GetFloat()
  424. {
  425. return _f;
  426. }
  427. #endregion // Methods
  428. }
  429. internal sealed class RefReaderCacheContainer : ReaderCacheContainerBase // Types.REF
  430. {
  431. #region Fields
  432. java.sql.Ref _r;
  433. #endregion // Fields
  434. #region Methods
  435. protected override void FetchInternal(ResultSet rs, int columnIndex)
  436. {
  437. _r = rs.getRef(columnIndex);
  438. }
  439. public override object GetValue()
  440. {
  441. return _r;
  442. }
  443. #endregion // Methods
  444. }
  445. internal sealed class Int16ReaderCacheContainer : ReaderCacheContainerBase // Types.SMALLINT
  446. {
  447. #region Fields
  448. short _s;
  449. #endregion // Fields
  450. #region Methods
  451. protected override void FetchInternal(ResultSet rs, int columnIndex)
  452. {
  453. _s = rs.getShort(columnIndex);
  454. }
  455. public override object GetValue()
  456. {
  457. return _s;
  458. }
  459. internal short GetInt16()
  460. {
  461. return _s;
  462. }
  463. #endregion // Methods
  464. }
  465. internal sealed class ByteReaderCacheContainer : ReaderCacheContainerBase // Types.TINYINT
  466. {
  467. #region Fields
  468. byte _b;
  469. #endregion // Fields
  470. #region Methods
  471. protected override void FetchInternal(ResultSet rs, int columnIndex)
  472. {
  473. _b = (byte)rs.getByte(columnIndex);
  474. }
  475. public override object GetValue()
  476. {
  477. return _b;
  478. }
  479. internal byte GetByte()
  480. {
  481. return _b;
  482. }
  483. #endregion // Methods
  484. }
  485. internal sealed class ObjectReaderCacheContainer : ReaderCacheContainerBase // Types.Distinct, Types.JAVA_OBJECT, Types.OTHER, Types.STRUCT
  486. {
  487. #region Fields
  488. object o;
  489. #endregion // Fields
  490. #region Methods
  491. protected override void FetchInternal(ResultSet rs, int columnIndex)
  492. {
  493. o = rs.getObject(columnIndex);
  494. }
  495. public override object GetValue()
  496. {
  497. return o;
  498. }
  499. #endregion // Methods
  500. }
  501. }