ReaderCache.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  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. string s = rs.getString(columnIndex);
  188. if (s != null)
  189. _g = new Guid(s);
  190. }
  191. public override object GetValue()
  192. {
  193. return _g;
  194. }
  195. internal Guid GetGuid()
  196. {
  197. return _g;
  198. }
  199. #endregion // Methods
  200. }
  201. internal sealed class ClobReaderCacheContainer : StringReaderCacheContainer // Types.CLOB
  202. {
  203. #region Fields
  204. char[] _c;
  205. #endregion // Fields
  206. #region Methods
  207. // FIXME : conside adding stream wrapper interface
  208. protected override void FetchInternal(ResultSet rs, int columnIndex)
  209. {
  210. java.sql.Clob clob = rs.getClob(columnIndex);
  211. if (clob != null) {
  212. long length = clob.length();
  213. if (length == 0) {
  214. _s = String.Empty;
  215. _c = String.Empty.ToCharArray();
  216. }
  217. else {
  218. java.io.Reader reader = clob.getCharacterStream();
  219. char[] charValue = new char[length];
  220. reader.read(charValue);
  221. _c = charValue;
  222. }
  223. }
  224. }
  225. public override object GetValue()
  226. {
  227. if (_s == null && _c != null) {
  228. _s = (_c.Length != 0) ? new String(_c) : String.Empty;
  229. }
  230. return _s;
  231. }
  232. internal override char[] GetChars()
  233. {
  234. return _c;
  235. }
  236. #endregion // Methods
  237. }
  238. internal sealed class TimeSpanReaderCacheContainer : ReaderCacheContainerBase // Types.TIME
  239. {
  240. #region Fields
  241. TimeSpan _t;
  242. #endregion // Fields
  243. #region Methods
  244. protected override void FetchInternal(ResultSet rs, int columnIndex)
  245. {
  246. Time t = rs.getTime(columnIndex);
  247. if (t != null) {
  248. _t = new TimeSpan(DbConvert.JavaTimeToClrTicks(t));
  249. }
  250. }
  251. public override object GetValue()
  252. {
  253. return _t;
  254. }
  255. internal TimeSpan GetTimeSpan()
  256. {
  257. return _t;
  258. }
  259. #endregion // Methods
  260. }
  261. internal class DateTimeReaderCacheContainer : ReaderCacheContainerBase // Types.TIMESTAMP
  262. {
  263. #region Fields
  264. protected DateTime _d;
  265. #endregion // Fields
  266. #region Methods
  267. protected override void FetchInternal(ResultSet rs, int columnIndex)
  268. {
  269. Date d = rs.getDate(columnIndex);
  270. if (d != null) {
  271. _d = new DateTime(DbConvert.JavaDateToClrTicks(d));
  272. }
  273. }
  274. public override object GetValue()
  275. {
  276. return _d;
  277. }
  278. internal DateTime GetDateTime()
  279. {
  280. return _d;
  281. }
  282. #endregion // Methods
  283. }
  284. internal sealed class TimestampReaderCacheContainer : DateTimeReaderCacheContainer // Types.DATE
  285. {
  286. protected override void FetchInternal(ResultSet rs, int columnIndex) {
  287. Timestamp ts = rs.getTimestamp(columnIndex);
  288. if (ts != null) {
  289. _d = new DateTime(DbConvert.JavaTimestampToClrTicks(ts));
  290. }
  291. }
  292. }
  293. internal sealed class DecimalReaderCacheContainer : ReaderCacheContainerBase // Types.DECIMAL, Types.NUMERIC
  294. {
  295. #region Fields
  296. decimal _d;
  297. #endregion // Fields
  298. #region Methods
  299. protected override void FetchInternal(ResultSet rs, int columnIndex)
  300. {
  301. java.math.BigDecimal bigDecimal = rs.getBigDecimal(columnIndex);
  302. if (bigDecimal != null) {
  303. _d = (decimal)vmw.common.PrimitiveTypeUtils.BigDecimalToDecimal(bigDecimal);
  304. }
  305. }
  306. public override object GetValue()
  307. {
  308. return _d;
  309. }
  310. internal decimal GetDecimal()
  311. {
  312. return _d;
  313. }
  314. #endregion // Methods
  315. }
  316. internal sealed class DoubleReaderCacheContainer : ReaderCacheContainerBase // Types.DOUBLE, Types.Float, Types.NUMERIC for Oracle with scale = -127
  317. {
  318. #region Fields
  319. double _d;
  320. #endregion // Fields
  321. #region Methods
  322. protected override void FetchInternal(ResultSet rs, int columnIndex)
  323. {
  324. _d = rs.getDouble(columnIndex);
  325. }
  326. public override object GetValue()
  327. {
  328. return _d;
  329. }
  330. internal double GetDouble()
  331. {
  332. return _d;
  333. }
  334. #endregion // Methods
  335. }
  336. internal sealed class Int32ReaderCacheContainer : ReaderCacheContainerBase // Types.INTEGER
  337. {
  338. #region Fields
  339. int _i;
  340. #endregion // Fields
  341. #region Methods
  342. protected override void FetchInternal(ResultSet rs, int columnIndex)
  343. {
  344. _i = rs.getInt(columnIndex);
  345. }
  346. public override object GetValue()
  347. {
  348. return _i;
  349. }
  350. internal int GetInt32()
  351. {
  352. return _i;
  353. }
  354. #endregion // Methods
  355. }
  356. internal class StringReaderCacheContainer : CharsReaderCacheContainer // Types.LONGVARCHAR, Types.VARCHAR, Types.CHAR
  357. {
  358. #region Fields
  359. protected string _s;
  360. #endregion // Fields
  361. #region Methods
  362. protected override void FetchInternal(ResultSet rs, int columnIndex)
  363. {
  364. _s = rs.getString(columnIndex);
  365. // Oracle Jdbc driver returns extra trailing 0 chars for NCHAR columns
  366. // if ((_s != null) && (_jdbcType == 1)) {
  367. // Console.WriteLine(_jdbcType);
  368. // int zeroIndex = ((string)_s).IndexOf((char)0);
  369. // if (zeroIndex > 0) {
  370. // Console.WriteLine("zero-padded");
  371. // _s = ((string)_s).Substring(0,zeroIndex);
  372. // }
  373. // else {
  374. // // Oracle sometimes pads with blanks (32)
  375. // int blankIndex = ((string)_s).IndexOf((char)32);
  376. // if (blankIndex > 0) {
  377. // Console.WriteLine("blank-padded");
  378. // _s = ((string)_s).Substring(0,blankIndex);
  379. // }
  380. // }
  381. // }
  382. }
  383. public override object GetValue()
  384. {
  385. return _s;
  386. }
  387. internal string GetString()
  388. {
  389. return _s;
  390. }
  391. internal override char[] GetChars()
  392. {
  393. return _s.ToCharArray();
  394. }
  395. #endregion // Methods
  396. }
  397. internal sealed class NullReaderCacheContainer : ReaderCacheContainerBase // Types.NULL
  398. {
  399. #region Fields
  400. #endregion // Fields
  401. #region Methods
  402. protected override void FetchInternal(ResultSet rs, int columnIndex)
  403. {
  404. }
  405. public override object GetValue()
  406. {
  407. return DBNull.Value;
  408. }
  409. #endregion // Methods
  410. }
  411. internal sealed class FloatReaderCacheContainer : ReaderCacheContainerBase // Types.REAL
  412. {
  413. #region Fields
  414. float _f;
  415. #endregion // Fields
  416. #region Methods
  417. protected override void FetchInternal(ResultSet rs, int columnIndex)
  418. {
  419. _f = rs.getFloat(columnIndex);
  420. }
  421. public override object GetValue()
  422. {
  423. return _f;
  424. }
  425. internal float GetFloat()
  426. {
  427. return _f;
  428. }
  429. #endregion // Methods
  430. }
  431. internal sealed class RefReaderCacheContainer : ReaderCacheContainerBase // Types.REF
  432. {
  433. #region Fields
  434. java.sql.Ref _r;
  435. #endregion // Fields
  436. #region Methods
  437. protected override void FetchInternal(ResultSet rs, int columnIndex)
  438. {
  439. _r = rs.getRef(columnIndex);
  440. }
  441. public override object GetValue()
  442. {
  443. return _r;
  444. }
  445. #endregion // Methods
  446. }
  447. internal sealed class Int16ReaderCacheContainer : ReaderCacheContainerBase // Types.SMALLINT
  448. {
  449. #region Fields
  450. short _s;
  451. #endregion // Fields
  452. #region Methods
  453. protected override void FetchInternal(ResultSet rs, int columnIndex)
  454. {
  455. _s = rs.getShort(columnIndex);
  456. }
  457. public override object GetValue()
  458. {
  459. return _s;
  460. }
  461. internal short GetInt16()
  462. {
  463. return _s;
  464. }
  465. #endregion // Methods
  466. }
  467. internal sealed class ByteReaderCacheContainer : ReaderCacheContainerBase // Types.TINYINT
  468. {
  469. #region Fields
  470. byte _b;
  471. #endregion // Fields
  472. #region Methods
  473. protected override void FetchInternal(ResultSet rs, int columnIndex)
  474. {
  475. _b = (byte)rs.getByte(columnIndex);
  476. }
  477. public override object GetValue()
  478. {
  479. return _b;
  480. }
  481. internal byte GetByte()
  482. {
  483. return _b;
  484. }
  485. #endregion // Methods
  486. }
  487. internal sealed class ObjectReaderCacheContainer : ReaderCacheContainerBase // Types.Distinct, Types.JAVA_OBJECT, Types.OTHER, Types.STRUCT
  488. {
  489. #region Fields
  490. object o;
  491. #endregion // Fields
  492. #region Methods
  493. protected override void FetchInternal(ResultSet rs, int columnIndex)
  494. {
  495. o = rs.getObject(columnIndex);
  496. }
  497. public override object GetValue()
  498. {
  499. return o;
  500. }
  501. #endregion // Methods
  502. }
  503. }