using System;\r
using java.sql;\r
\r
-namespace System.Data.Common\r
+namespace System.Data.ProviderBase\r
{\r
public interface IReaderCacheContainer\r
{\r
- void Fetch(ResultSet rs, int columnIndex);\r
+ void Fetch(ResultSet rs, int columnIndex, bool isSequential);\r
bool IsNull();\r
+ bool IsNumeric();\r
object GetValue();\r
}\r
\r
- internal abstract class ReaderCacheContainerBase : IReaderCacheContainer\r
+ public abstract class ReaderCacheContainerBase : IReaderCacheContainer\r
{\r
#region Fields\r
\r
#region Methods\r
\r
protected abstract void FetchInternal(ResultSet rs, int columnIndex);\r
+ protected virtual void FetchInternal(ResultSet rs, int columnIndex, bool isSequential) {\r
+ FetchInternal(rs, columnIndex);\r
+ }\r
+\r
+ public virtual bool IsNumeric() {\r
+ return false;\r
+ }\r
\r
public abstract object GetValue(); \r
\r
- public void Fetch(ResultSet rs, int columnIndex)\r
+ public void Fetch(ResultSet rs, int columnIndex, bool isSequential)\r
{\r
- FetchInternal(rs, columnIndex + 1);\r
+ FetchInternal(rs, columnIndex + 1, isSequential);\r
_isNull = rs.wasNull();\r
}\r
\r
{\r
#region Fields\r
\r
- java.sql.Array _a;\r
+ object _a;\r
\r
#endregion // Fields\r
\r
\r
protected override void FetchInternal(ResultSet rs, int columnIndex)\r
{\r
- _a = rs.getArray(columnIndex);\r
+ _a = rs.getArray(columnIndex).getArray();\r
}\r
\r
public override object GetValue()\r
return _a;\r
}\r
\r
- internal java.sql.Array GetArray()\r
- {\r
- return _a;\r
- }\r
-\r
#endregion // Methods\r
}\r
\r
_l = rs.getLong(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
+\r
public override object GetValue()\r
{\r
return _l;\r
\r
internal byte[] GetBytes()\r
{\r
- return _b;\r
+ return (byte[])GetValue();\r
+ }\r
+\r
+ internal virtual long GetBytes(\r
+ long dataIndex,\r
+ byte[] buffer,\r
+ int bufferIndex,\r
+ int length) {\r
+ if (_b == null)\r
+ return 0;\r
+ if (buffer == null)\r
+ return _b.LongLength;\r
+ long actualLength = ((dataIndex + length) >= _b.LongLength) ? (_b.LongLength - dataIndex) : length;\r
+ Array.Copy(_b,dataIndex,buffer,bufferIndex,actualLength);\r
+ return actualLength;\r
}\r
\r
#endregion // Methods\r
_b = rs.getBoolean(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _b;\r
#region Fields\r
\r
static readonly byte[] _emptyByteArr = new byte[0];\r
+ java.sql.Blob _blob;\r
\r
#endregion // Fields\r
\r
#region Methods\r
\r
- protected override void FetchInternal(ResultSet rs, int columnIndex)\r
+ protected override void FetchInternal(ResultSet rs, int columnIndex) {\r
+ throw new NotImplementedException("Should not be called");\r
+ }\r
+\r
+\r
+ protected override void FetchInternal(ResultSet rs, int columnIndex, bool isSequential)\r
{\r
- java.sql.Blob blob = rs.getBlob(columnIndex);\r
- if (blob != null) {\r
- long length = blob.length(); \r
+ _blob = rs.getBlob(columnIndex);\r
+ if (!isSequential)\r
+ ReadAll();\r
+ \r
+ }\r
+\r
+ void ReadAll() {\r
+ if (_blob != null) {\r
+ long length = _blob.length(); \r
if (length == 0) {\r
_b = _emptyByteArr;\r
}\r
else { \r
- java.io.InputStream input = blob.getBinaryStream(); \r
+ java.io.InputStream input = _blob.getBinaryStream(); \r
byte[] byteValue = new byte[length];\r
sbyte[] sbyteValue = vmw.common.TypeUtils.ToSByteArray(byteValue);\r
input.read(sbyteValue);\r
\r
public override object GetValue()\r
{\r
- return _b;\r
+ if (_b == null)\r
+ ReadAll();\r
+ return base.GetValue();\r
+ }\r
+\r
+ internal override long GetBytes(long dataIndex, byte[] buffer, int bufferIndex, int length) {\r
+ if (_b != null)\r
+ return base.GetBytes (dataIndex, buffer, bufferIndex, length);\r
+\r
+ if (_blob == null)\r
+ return 0;\r
+\r
+ if (buffer == null)\r
+ return _blob.length();\r
+\r
+ java.io.InputStream input = _blob.getBinaryStream();\r
+ input.skip(dataIndex);\r
+ return input.read(vmw.common.TypeUtils.ToSByteArray(buffer), bufferIndex, length);\r
}\r
\r
+\r
#endregion // Methods\r
}\r
\r
\r
#region Methods\r
\r
- internal abstract char[] GetChars();\r
+ internal abstract long GetChars(\r
+ long dataIndex,\r
+ char[] buffer,\r
+ int bufferIndex,\r
+ int length);\r
\r
#endregion // Methods\r
}\r
\r
protected override void FetchInternal(ResultSet rs, int columnIndex)\r
{\r
- _g = new Guid(rs.getString(columnIndex));\r
+ string s = rs.getString(columnIndex);\r
+ if (s != null)\r
+ _g = new Guid(s);\r
}\r
\r
public override object GetValue()\r
{\r
#region Fields\r
\r
- char[] _c;\r
+ java.sql.Clob _clob;\r
\r
#endregion // Fields\r
\r
#region Methods\r
\r
- // FIXME : conside adding stream wrapper interface\r
-\r
- protected override void FetchInternal(ResultSet rs, int columnIndex)\r
+ protected override void FetchInternal(ResultSet rs, int columnIndex, bool isSequential)\r
{\r
- java.sql.Clob clob = rs.getClob(columnIndex); \r
- if (clob != null) {\r
- long length = clob.length(); \r
+ _clob = rs.getClob(columnIndex);\r
+ if (!isSequential)\r
+ ReadAll();\r
+ \r
+ }\r
+\r
+ void ReadAll() {\r
+ if (_clob != null) {\r
+ long length = _clob.length(); \r
if (length == 0) {\r
_s = String.Empty;\r
- _c = String.Empty.ToCharArray();\r
}\r
else { \r
- java.io.Reader reader = clob.getCharacterStream(); \r
+ java.io.Reader reader = _clob.getCharacterStream(); \r
char[] charValue = new char[length];\r
reader.read(charValue);\r
- _c = charValue;\r
- \r
+ if (charValue != null)\r
+ _s = new String(charValue);\r
}\r
}\r
}\r
\r
public override object GetValue()\r
{\r
- if (_s == null && _c != null) {\r
- _s = (_c.Length != 0) ? new String(_c) : String.Empty;\r
- }\r
- return _s;\r
+ if (_s == null)\r
+ ReadAll();\r
+ return base.GetValue();\r
}\r
\r
- internal override char[] GetChars()\r
- {\r
- return _c;\r
+ internal override long GetChars(long dataIndex, char[] buffer, int bufferIndex, int length) {\r
+ if (_s != null)\r
+ return base.GetChars (dataIndex, buffer, bufferIndex, length);\r
+\r
+ if (_clob == null)\r
+ return 0;\r
+\r
+ if (buffer == null)\r
+ return _clob.length();\r
+\r
+ java.io.Reader reader = _clob.getCharacterStream();\r
+ reader.skip(dataIndex);\r
+ return reader.read(buffer, bufferIndex, length);\r
}\r
\r
+\r
#endregion // Methods\r
}\r
\r
}\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _d;\r
_d = rs.getDouble(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _d;\r
_i = rs.getInt(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _i;\r
{\r
return _s;\r
}\r
-\r
- internal override char[] GetChars()\r
- {\r
- return _s.ToCharArray();\r
+ \r
+ internal override long GetChars(long dataIndex, char[] buffer, int bufferIndex, int length) {\r
+ if (_s == null)\r
+ return 0;\r
+ if (buffer == null)\r
+ return _s.Length;\r
+ int actualLength = ((dataIndex + length) >= _s.Length) ? (_s.Length - (int)dataIndex) : length;\r
+ _s.CopyTo((int)dataIndex, buffer, bufferIndex, actualLength);\r
+ return actualLength;\r
}\r
\r
+\r
#endregion // Methods\r
}\r
\r
_f = rs.getFloat(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _f;\r
_s = rs.getShort(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _s;\r
_b = (byte)rs.getByte(columnIndex);\r
}\r
\r
+ public override bool IsNumeric() {\r
+ return true;\r
+ }\r
+\r
public override object GetValue()\r
{\r
return _b;\r