| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692 |
- //
- // System.Data.ProviderBase.ReaderCache.cs
- //
- // Authors:
- // Konstantin Triger <[email protected]>
- // Boris Kirzner <[email protected]>
- //
- // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System;
- using java.sql;
- namespace System.Data.Common
- {
- public interface IReaderCacheContainer
- {
- void Fetch(ResultSet rs, int columnIndex);
- bool IsNull();
- object GetValue();
- }
- internal abstract class ReaderCacheContainerBase : IReaderCacheContainer
- {
- #region Fields
- bool _isNull;
- #endregion // Fields
- #region Methods
- protected abstract void FetchInternal(ResultSet rs, int columnIndex);
- public abstract object GetValue();
- public void Fetch(ResultSet rs, int columnIndex)
- {
- FetchInternal(rs, columnIndex + 1);
- _isNull = rs.wasNull();
- }
- public bool IsNull()
- {
- return _isNull;
- }
- #endregion // Methods
- }
- internal sealed class ArrayReaderCacheContainer : ReaderCacheContainerBase // Types.ARRAY
- {
- #region Fields
- java.sql.Array _a;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _a = rs.getArray(columnIndex);
- }
- public override object GetValue()
- {
- return _a;
- }
- internal java.sql.Array GetArray()
- {
- return _a;
- }
- #endregion // Methods
- }
- internal sealed class Int64ReaderCacheContainer : ReaderCacheContainerBase // Types.BIGINT
- {
- #region Fields
-
- long _l;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _l = rs.getLong(columnIndex);
- }
- public override object GetValue()
- {
- return _l;
- }
- internal long GetInt64()
- {
- return _l;
- }
- #endregion // Methods
- }
- internal class BytesReaderCacheContainer : ReaderCacheContainerBase // Types.BINARY, Types.VARBINARY, Types.LONGVARBINARY
- {
- #region Fields
- protected byte[] _b;
-
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- sbyte[] sbyteArray = rs.getBytes(columnIndex);
- if (sbyteArray != null) {
- _b = (byte[])vmw.common.TypeUtils.ToByteArray(sbyteArray);
- }
- }
- public override object GetValue()
- {
- return _b;
- }
- internal byte[] GetBytes()
- {
- return _b;
- }
- #endregion // Methods
- }
- internal sealed class BooleanReaderCacheContainer : ReaderCacheContainerBase // Types.BIT
- {
- #region Fields
-
- bool _b;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _b = rs.getBoolean(columnIndex);
- }
- public override object GetValue()
- {
- return _b;
- }
- internal bool GetBoolean()
- {
- return _b;
- }
- #endregion // Methods
- }
- internal sealed class BlobReaderCacheContainer : BytesReaderCacheContainer // Types.BLOB
- {
- #region Fields
- static readonly byte[] _emptyByteArr = new byte[0];
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- java.sql.Blob blob = rs.getBlob(columnIndex);
- if (blob != null) {
- long length = blob.length();
- if (length == 0) {
- _b = _emptyByteArr;
- }
- else {
- java.io.InputStream input = blob.getBinaryStream();
- byte[] byteValue = new byte[length];
- sbyte[] sbyteValue = vmw.common.TypeUtils.ToSByteArray(byteValue);
- input.read(sbyteValue);
- _b = byteValue;
- }
- }
- }
- public override object GetValue()
- {
- return _b;
- }
- #endregion // Methods
- }
-
- internal abstract class CharsReaderCacheContainer : ReaderCacheContainerBase //
- {
- #region Fields
-
- #endregion // Fields
- #region Methods
- internal abstract char[] GetChars();
- #endregion // Methods
- }
- internal sealed class GuidReaderCacheContainer : ReaderCacheContainerBase // Types.CHAR
- {
- #region Fields
-
- Guid _g;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- string s = rs.getString(columnIndex);
- if (s != null)
- _g = new Guid();
- }
- public override object GetValue()
- {
- return _g;
- }
- internal Guid GetGuid()
- {
- return _g;
- }
- #endregion // Methods
- }
- internal sealed class ClobReaderCacheContainer : StringReaderCacheContainer // Types.CLOB
- {
- #region Fields
-
- char[] _c;
- #endregion // Fields
- #region Methods
- // FIXME : conside adding stream wrapper interface
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- java.sql.Clob clob = rs.getClob(columnIndex);
- if (clob != null) {
- long length = clob.length();
- if (length == 0) {
- _s = String.Empty;
- _c = String.Empty.ToCharArray();
- }
- else {
- java.io.Reader reader = clob.getCharacterStream();
- char[] charValue = new char[length];
- reader.read(charValue);
- _c = charValue;
-
- }
- }
- }
- public override object GetValue()
- {
- if (_s == null && _c != null) {
- _s = (_c.Length != 0) ? new String(_c) : String.Empty;
- }
- return _s;
- }
- internal override char[] GetChars()
- {
- return _c;
- }
- #endregion // Methods
- }
-
- internal sealed class TimeSpanReaderCacheContainer : ReaderCacheContainerBase // Types.TIME
- {
- #region Fields
-
- TimeSpan _t;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- Time t = rs.getTime(columnIndex);
- if (t != null) {
- _t = new TimeSpan(DbConvert.JavaTimeToClrTicks(t));
- }
- }
- public override object GetValue()
- {
- return _t;
- }
- internal TimeSpan GetTimeSpan()
- {
- return _t;
- }
- #endregion // Methods
- }
- internal class DateTimeReaderCacheContainer : ReaderCacheContainerBase // Types.TIMESTAMP
- {
- #region Fields
-
- protected DateTime _d;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- Date d = rs.getDate(columnIndex);
- if (d != null) {
- _d = new DateTime(DbConvert.JavaDateToClrTicks(d));
- }
- }
- public override object GetValue()
- {
- return _d;
- }
- internal DateTime GetDateTime()
- {
- return _d;
- }
- #endregion // Methods
- }
- internal sealed class TimestampReaderCacheContainer : DateTimeReaderCacheContainer // Types.DATE
- {
- protected override void FetchInternal(ResultSet rs, int columnIndex) {
- Timestamp ts = rs.getTimestamp(columnIndex);
- if (ts != null) {
- _d = new DateTime(DbConvert.JavaTimestampToClrTicks(ts));
- }
- }
- }
- internal sealed class DecimalReaderCacheContainer : ReaderCacheContainerBase // Types.DECIMAL, Types.NUMERIC
- {
- #region Fields
-
- decimal _d;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- java.math.BigDecimal bigDecimal = rs.getBigDecimal(columnIndex);
- if (bigDecimal != null) {
- _d = (decimal)vmw.common.PrimitiveTypeUtils.BigDecimalToDecimal(bigDecimal);
- }
- }
- public override object GetValue()
- {
- return _d;
- }
- internal decimal GetDecimal()
- {
- return _d;
- }
- #endregion // Methods
- }
- internal sealed class DoubleReaderCacheContainer : ReaderCacheContainerBase // Types.DOUBLE, Types.Float, Types.NUMERIC for Oracle with scale = -127
- {
- #region Fields
-
- double _d;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _d = rs.getDouble(columnIndex);
- }
- public override object GetValue()
- {
- return _d;
- }
- internal double GetDouble()
- {
- return _d;
- }
- #endregion // Methods
- }
- internal sealed class Int32ReaderCacheContainer : ReaderCacheContainerBase // Types.INTEGER
- {
- #region Fields
-
- int _i;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _i = rs.getInt(columnIndex);
- }
- public override object GetValue()
- {
- return _i;
- }
- internal int GetInt32()
- {
- return _i;
- }
- #endregion // Methods
- }
- internal class StringReaderCacheContainer : CharsReaderCacheContainer // Types.LONGVARCHAR, Types.VARCHAR, Types.CHAR
- {
- #region Fields
-
- protected string _s;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _s = rs.getString(columnIndex);
- // Oracle Jdbc driver returns extra trailing 0 chars for NCHAR columns
- // if ((_s != null) && (_jdbcType == 1)) {
- // Console.WriteLine(_jdbcType);
- // int zeroIndex = ((string)_s).IndexOf((char)0);
- // if (zeroIndex > 0) {
- // Console.WriteLine("zero-padded");
- // _s = ((string)_s).Substring(0,zeroIndex);
- // }
- // else {
- // // Oracle sometimes pads with blanks (32)
- // int blankIndex = ((string)_s).IndexOf((char)32);
- // if (blankIndex > 0) {
- // Console.WriteLine("blank-padded");
- // _s = ((string)_s).Substring(0,blankIndex);
- // }
- // }
- // }
- }
- public override object GetValue()
- {
- return _s;
- }
- internal string GetString()
- {
- return _s;
- }
- internal override char[] GetChars()
- {
- return _s.ToCharArray();
- }
- #endregion // Methods
- }
- internal sealed class NullReaderCacheContainer : ReaderCacheContainerBase // Types.NULL
- {
- #region Fields
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- }
- public override object GetValue()
- {
- return DBNull.Value;
- }
- #endregion // Methods
- }
- internal sealed class FloatReaderCacheContainer : ReaderCacheContainerBase // Types.REAL
- {
- #region Fields
-
- float _f;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _f = rs.getFloat(columnIndex);
- }
- public override object GetValue()
- {
- return _f;
- }
- internal float GetFloat()
- {
- return _f;
- }
- #endregion // Methods
- }
- internal sealed class RefReaderCacheContainer : ReaderCacheContainerBase // Types.REF
- {
- #region Fields
-
- java.sql.Ref _r;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _r = rs.getRef(columnIndex);
- }
- public override object GetValue()
- {
- return _r;
- }
- #endregion // Methods
- }
- internal sealed class Int16ReaderCacheContainer : ReaderCacheContainerBase // Types.SMALLINT
- {
- #region Fields
-
- short _s;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _s = rs.getShort(columnIndex);
- }
- public override object GetValue()
- {
- return _s;
- }
- internal short GetInt16()
- {
- return _s;
- }
- #endregion // Methods
- }
- internal sealed class ByteReaderCacheContainer : ReaderCacheContainerBase // Types.TINYINT
- {
- #region Fields
-
- byte _b;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- _b = (byte)rs.getByte(columnIndex);
- }
- public override object GetValue()
- {
- return _b;
- }
- internal byte GetByte()
- {
- return _b;
- }
- #endregion // Methods
- }
- internal sealed class ObjectReaderCacheContainer : ReaderCacheContainerBase // Types.Distinct, Types.JAVA_OBJECT, Types.OTHER, Types.STRUCT
- {
- #region Fields
-
- object o;
- #endregion // Fields
- #region Methods
- protected override void FetchInternal(ResultSet rs, int columnIndex)
- {
- o = rs.getObject(columnIndex);
- }
- public override object GetValue()
- {
- return o;
- }
- #endregion // Methods
- }
- }
|