2 // System.Data.ProviderBase.ReaderCache.cs
\r
5 // Konstantin Triger <kostat@mainsoft.com>
6 // Boris Kirzner <borisk@mainsoft.com>
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 namespace System.Data.ProviderBase
\r
37 public interface IReaderCacheContainer
\r
39 void Fetch(ResultSet rs, int columnIndex, bool isSequential);
\r
45 public abstract class ReaderCacheContainerBase : IReaderCacheContainer
\r
51 #endregion // Fields
\r
55 protected abstract void FetchInternal(ResultSet rs, int columnIndex);
\r
56 protected virtual void FetchInternal(ResultSet rs, int columnIndex, bool isSequential) {
\r
57 FetchInternal(rs, columnIndex);
\r
60 public virtual bool IsNumeric() {
\r
64 public abstract object GetValue();
\r
66 public void Fetch(ResultSet rs, int columnIndex, bool isSequential)
\r
68 FetchInternal(rs, columnIndex + 1, isSequential);
\r
69 _isNull = rs.wasNull();
\r
72 public bool IsNull()
\r
77 #endregion // Methods
\r
81 internal sealed class ArrayReaderCacheContainer : ReaderCacheContainerBase // Types.ARRAY
\r
87 #endregion // Fields
\r
91 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
93 _a = rs.getArray(columnIndex).getArray();
\r
96 public override object GetValue()
\r
101 #endregion // Methods
\r
105 internal sealed class Int64ReaderCacheContainer : ReaderCacheContainerBase // Types.BIGINT
\r
111 #endregion // Fields
\r
115 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
117 _l = rs.getLong(columnIndex);
\r
120 public override bool IsNumeric() {
\r
125 public override object GetValue()
\r
130 internal long GetInt64()
\r
135 #endregion // Methods
\r
139 internal class BytesReaderCacheContainer : ReaderCacheContainerBase // Types.BINARY, Types.VARBINARY, Types.LONGVARBINARY
\r
143 protected byte[] _b;
\r
145 #endregion // Fields
\r
149 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
151 sbyte[] sbyteArray = rs.getBytes(columnIndex);
\r
152 if (sbyteArray != null) {
\r
153 _b = (byte[])vmw.common.TypeUtils.ToByteArray(sbyteArray);
\r
157 public override object GetValue()
\r
162 internal byte[] GetBytes()
\r
164 return (byte[])GetValue();
\r
167 internal virtual long GetBytes(
\r
174 if (buffer == null)
\r
175 return _b.LongLength;
\r
176 long actualLength = ((dataIndex + length) >= _b.LongLength) ? (_b.LongLength - dataIndex) : length;
\r
177 Array.Copy(_b,dataIndex,buffer,bufferIndex,actualLength);
\r
178 return actualLength;
\r
181 #endregion // Methods
\r
185 internal sealed class BooleanReaderCacheContainer : ReaderCacheContainerBase // Types.BIT
\r
191 #endregion // Fields
\r
195 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
197 _b = rs.getBoolean(columnIndex);
\r
200 public override bool IsNumeric() {
\r
204 public override object GetValue()
\r
209 internal bool GetBoolean()
\r
214 #endregion // Methods
\r
218 internal sealed class BlobReaderCacheContainer : BytesReaderCacheContainer // Types.BLOB
\r
222 static readonly byte[] _emptyByteArr = new byte[0];
\r
223 java.sql.Blob _blob;
\r
225 #endregion // Fields
\r
229 protected override void FetchInternal(ResultSet rs, int columnIndex) {
\r
230 throw new NotImplementedException("Should not be called");
\r
234 protected override void FetchInternal(ResultSet rs, int columnIndex, bool isSequential)
\r
236 _blob = rs.getBlob(columnIndex);
\r
243 if (_blob != null) {
\r
244 long length = _blob.length();
\r
246 _b = _emptyByteArr;
\r
249 java.io.InputStream input = _blob.getBinaryStream();
\r
250 byte[] byteValue = new byte[length];
\r
251 sbyte[] sbyteValue = vmw.common.TypeUtils.ToSByteArray(byteValue);
\r
252 input.read(sbyteValue);
\r
258 public override object GetValue()
\r
262 return base.GetValue();
\r
265 internal override long GetBytes(long dataIndex, byte[] buffer, int bufferIndex, int length) {
\r
267 return base.GetBytes (dataIndex, buffer, bufferIndex, length);
\r
272 if (buffer == null)
\r
273 return _blob.length();
\r
275 java.io.InputStream input = _blob.getBinaryStream();
\r
276 input.skip(dataIndex);
\r
277 return input.read(vmw.common.TypeUtils.ToSByteArray(buffer), bufferIndex, length);
\r
281 #endregion // Methods
\r
285 internal abstract class CharsReaderCacheContainer : ReaderCacheContainerBase //
\r
289 #endregion // Fields
\r
293 internal abstract long GetChars(
\r
299 #endregion // Methods
\r
303 internal sealed class GuidReaderCacheContainer : ReaderCacheContainerBase // Types.CHAR
\r
309 #endregion // Fields
\r
313 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
315 string s = rs.getString(columnIndex);
\r
320 public override object GetValue()
\r
325 internal Guid GetGuid()
\r
330 #endregion // Methods
\r
334 internal sealed class ClobReaderCacheContainer : StringReaderCacheContainer // Types.CLOB
\r
338 java.sql.Clob _clob;
\r
340 #endregion // Fields
\r
344 protected override void FetchInternal(ResultSet rs, int columnIndex, bool isSequential)
\r
346 _clob = rs.getClob(columnIndex);
\r
353 if (_clob != null) {
\r
354 long length = _clob.length();
\r
359 java.io.Reader reader = _clob.getCharacterStream();
\r
360 char[] charValue = new char[length];
\r
361 reader.read(charValue);
\r
362 if (charValue != null)
\r
363 _s = new String(charValue);
\r
368 public override object GetValue()
\r
372 return base.GetValue();
\r
375 internal override long GetChars(long dataIndex, char[] buffer, int bufferIndex, int length) {
\r
377 return base.GetChars (dataIndex, buffer, bufferIndex, length);
\r
382 if (buffer == null)
\r
383 return _clob.length();
\r
385 java.io.Reader reader = _clob.getCharacterStream();
\r
386 reader.skip(dataIndex);
\r
387 return reader.read(buffer, bufferIndex, length);
\r
391 #endregion // Methods
\r
395 internal sealed class TimeSpanReaderCacheContainer : ReaderCacheContainerBase // Types.TIME
\r
401 #endregion // Fields
\r
405 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
407 Time t = rs.getTime(columnIndex);
\r
409 _t = new TimeSpan(DbConvert.JavaTimeToClrTicks(t));
\r
413 public override object GetValue()
\r
418 internal TimeSpan GetTimeSpan()
\r
423 #endregion // Methods
\r
427 internal class DateTimeReaderCacheContainer : ReaderCacheContainerBase // Types.TIMESTAMP
\r
431 protected DateTime _d;
\r
433 #endregion // Fields
\r
437 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
439 Date d = rs.getDate(columnIndex);
\r
441 _d = new DateTime(DbConvert.JavaDateToClrTicks(d));
\r
445 public override object GetValue()
\r
450 internal DateTime GetDateTime()
\r
455 #endregion // Methods
\r
458 internal sealed class TimestampReaderCacheContainer : DateTimeReaderCacheContainer // Types.DATE
\r
460 protected override void FetchInternal(ResultSet rs, int columnIndex) {
\r
461 Timestamp ts = rs.getTimestamp(columnIndex);
\r
463 _d = new DateTime(DbConvert.JavaTimestampToClrTicks(ts));
\r
469 internal sealed class DecimalReaderCacheContainer : ReaderCacheContainerBase // Types.DECIMAL, Types.NUMERIC
\r
475 #endregion // Fields
\r
479 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
481 java.math.BigDecimal bigDecimal = rs.getBigDecimal(columnIndex);
\r
482 if (bigDecimal != null) {
\r
483 _d = (decimal)vmw.common.PrimitiveTypeUtils.BigDecimalToDecimal(bigDecimal);
\r
487 public override bool IsNumeric() {
\r
491 public override object GetValue()
\r
496 internal decimal GetDecimal()
\r
501 #endregion // Methods
\r
505 internal sealed class DoubleReaderCacheContainer : ReaderCacheContainerBase // Types.DOUBLE, Types.Float, Types.NUMERIC for Oracle with scale = -127
\r
511 #endregion // Fields
\r
515 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
517 _d = rs.getDouble(columnIndex);
\r
520 public override bool IsNumeric() {
\r
524 public override object GetValue()
\r
529 internal double GetDouble()
\r
534 #endregion // Methods
\r
538 internal sealed class Int32ReaderCacheContainer : ReaderCacheContainerBase // Types.INTEGER
\r
544 #endregion // Fields
\r
548 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
550 _i = rs.getInt(columnIndex);
\r
553 public override bool IsNumeric() {
\r
557 public override object GetValue()
\r
562 internal int GetInt32()
\r
567 #endregion // Methods
\r
571 internal class StringReaderCacheContainer : CharsReaderCacheContainer // Types.LONGVARCHAR, Types.VARCHAR, Types.CHAR
\r
575 protected string _s;
\r
577 #endregion // Fields
\r
581 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
583 _s = rs.getString(columnIndex);
\r
584 // Oracle Jdbc driver returns extra trailing 0 chars for NCHAR columns
\r
585 // if ((_s != null) && (_jdbcType == 1)) {
\r
586 // Console.WriteLine(_jdbcType);
\r
587 // int zeroIndex = ((string)_s).IndexOf((char)0);
\r
588 // if (zeroIndex > 0) {
\r
589 // Console.WriteLine("zero-padded");
\r
590 // _s = ((string)_s).Substring(0,zeroIndex);
\r
593 // // Oracle sometimes pads with blanks (32)
\r
594 // int blankIndex = ((string)_s).IndexOf((char)32);
\r
595 // if (blankIndex > 0) {
\r
596 // Console.WriteLine("blank-padded");
\r
597 // _s = ((string)_s).Substring(0,blankIndex);
\r
603 public override object GetValue()
\r
608 internal string GetString()
\r
613 internal override long GetChars(long dataIndex, char[] buffer, int bufferIndex, int length) {
\r
616 if (buffer == null)
\r
618 int actualLength = ((dataIndex + length) >= _s.Length) ? (_s.Length - (int)dataIndex) : length;
\r
619 _s.CopyTo((int)dataIndex, buffer, bufferIndex, actualLength);
\r
620 return actualLength;
\r
624 #endregion // Methods
\r
628 internal sealed class NullReaderCacheContainer : ReaderCacheContainerBase // Types.NULL
\r
632 #endregion // Fields
\r
636 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
640 public override object GetValue()
\r
642 return DBNull.Value;
\r
645 #endregion // Methods
\r
649 internal sealed class FloatReaderCacheContainer : ReaderCacheContainerBase // Types.REAL
\r
655 #endregion // Fields
\r
659 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
661 _f = rs.getFloat(columnIndex);
\r
664 public override bool IsNumeric() {
\r
668 public override object GetValue()
\r
673 internal float GetFloat()
\r
678 #endregion // Methods
\r
682 internal sealed class RefReaderCacheContainer : ReaderCacheContainerBase // Types.REF
\r
688 #endregion // Fields
\r
692 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
694 _r = rs.getRef(columnIndex);
\r
697 public override object GetValue()
\r
702 #endregion // Methods
\r
706 internal sealed class Int16ReaderCacheContainer : ReaderCacheContainerBase // Types.SMALLINT
\r
712 #endregion // Fields
\r
716 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
718 _s = rs.getShort(columnIndex);
\r
721 public override bool IsNumeric() {
\r
725 public override object GetValue()
\r
730 internal short GetInt16()
\r
735 #endregion // Methods
\r
739 internal sealed class ByteReaderCacheContainer : ReaderCacheContainerBase // Types.TINYINT
\r
745 #endregion // Fields
\r
749 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
751 _b = (byte)rs.getByte(columnIndex);
\r
754 public override bool IsNumeric() {
\r
758 public override object GetValue()
\r
763 internal byte GetByte()
\r
768 #endregion // Methods
\r
772 internal sealed class ObjectReaderCacheContainer : ReaderCacheContainerBase // Types.Distinct, Types.JAVA_OBJECT, Types.OTHER, Types.STRUCT
\r
778 #endregion // Fields
\r
782 protected override void FetchInternal(ResultSet rs, int columnIndex)
\r
784 o = rs.getObject(columnIndex);
\r
787 public override object GetValue()
\r
792 #endregion // Methods
\r