ReaderCache.cs 12 KB

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