* OdbcParameterTest.cs: Fixed compilation on 1.0 profile.
[mono.git] / mcs / class / System.Data / System.Data.ProviderBase.jvm / ReaderCache.cs
index ce5459923754cc30c4c7bd6c3262d5b80335a370..4100bd10f5a8dba1af18782a63a6ea1f0a6c4bb2 100644 (file)
 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
@@ -52,12 +53,19 @@ namespace System.Data.Common
                #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
@@ -74,7 +82,7 @@ namespace System.Data.Common
        {\r
                #region Fields\r
 \r
-               java.sql.Array _a;\r
+               object _a;\r
 \r
                #endregion // Fields\r
 \r
@@ -82,7 +90,7 @@ namespace System.Data.Common
 \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
@@ -90,11 +98,6 @@ namespace System.Data.Common
                        return _a;\r
                }\r
 \r
-               internal java.sql.Array GetArray()\r
-               {\r
-                       return _a;\r
-               }\r
-\r
                #endregion // Methods\r
        }\r
 \r
@@ -114,6 +117,11 @@ namespace System.Data.Common
                        _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
@@ -153,7 +161,21 @@ namespace System.Data.Common
 \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
@@ -175,6 +197,10 @@ namespace System.Data.Common
                        _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
@@ -194,21 +220,33 @@ namespace System.Data.Common
                #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
@@ -219,9 +257,27 @@ namespace System.Data.Common
 \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
@@ -234,7 +290,11 @@ namespace System.Data.Common
 \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
@@ -254,7 +314,7 @@ namespace System.Data.Common
                {\r
                        string s = rs.getString(columnIndex);\r
                        if (s != null)\r
-                               _g = new Guid();\r
+                               _g = new Guid(s);\r
                }\r
 \r
                public override object GetValue()\r
@@ -275,46 +335,59 @@ namespace System.Data.Common
        {\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
@@ -411,6 +484,10 @@ namespace System.Data.Common
                        }\r
                }\r
 \r
+               public override bool IsNumeric() {\r
+                       return true;\r
+               }\r
+\r
                public override object GetValue()\r
                {\r
                        return _d;\r
@@ -440,6 +517,10 @@ namespace System.Data.Common
                        _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
@@ -469,6 +550,10 @@ namespace System.Data.Common
                        _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
@@ -524,12 +609,18 @@ namespace System.Data.Common
                {\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
@@ -570,6 +661,10 @@ namespace System.Data.Common
                        _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
@@ -623,6 +718,10 @@ namespace System.Data.Common
                        _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
@@ -652,6 +751,10 @@ namespace System.Data.Common
                        _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