[Task] Add an extra check in Task.WaitAny to make sure the index returned is valid
[mono.git] / mcs / class / System.Data / System.Data.Common / DbDataReader.cs
index efdf7897ff34dc4838347238c87726c8990911f0..7d046978a41ca66e73a53f66a106efa4ae174289 100644 (file)
@@ -7,13 +7,37 @@
 // Copyright (C) Tim Coleman, 2003
 //
 
-#if NET_2_0
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.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.
+//
+
+#if NET_2_0 || TARGET_JVM
 
 using System.Collections;
+using System.ComponentModel;
 using System.Data;
 
 namespace System.Data.Common {
-       public abstract class DbDataReader : MarshalByRefObject, IDataReader, IDataReader2, IDataRecord, IDataRecord2, IDisposable, IEnumerable
+       public abstract class DbDataReader : MarshalByRefObject, IDataReader, IDataRecord, IDisposable, IEnumerable
        {
                #region Constructors
 
@@ -32,32 +56,50 @@ namespace System.Data.Common {
                public abstract object this [int index] { get; }
                public abstract object this [string name] { get; }
                public abstract int RecordsAffected { get; }
-               public abstract int VisibleFieldCount { get; }
 
+#if NET_2_0
+               public virtual int VisibleFieldCount {
+                       get { return FieldCount; }
+               }
+#endif
                #endregion // Properties
 
                #region Methods
 
                public abstract void Close ();
-               public abstract void Dispose ();
                public abstract bool GetBoolean (int i);
                public abstract byte GetByte (int i);
                public abstract long GetBytes (int i, long fieldOffset, byte[] buffer, int bufferOffset, int length);
                public abstract char GetChar (int i);
                public abstract long GetChars (int i, long dataIndex, char[] buffer, int bufferIndex, int length);
 
-               [MonoTODO]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public void Dispose ()
+               {
+                       Dispose (true); 
+               }
+               
+               protected virtual void Dispose (bool disposing)
+               {
+                       if (disposing)
+                               Close ();
+               }
+#if NET_2_0
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public DbDataReader GetData (int i)
                {
-                       throw new NotImplementedException ();
+                       return ((DbDataReader) this [i]);
                }
+#endif
 
                public abstract string GetDataTypeName (int i);
                public abstract DateTime GetDateTime (int i);
                public abstract decimal GetDecimal (int i);
                public abstract double GetDouble (int i);
+
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public abstract IEnumerator GetEnumerator ();
-               public abstract Type GetFieldProviderSpecificType (int i);
+
                public abstract Type GetFieldType (int i);
                public abstract float GetFloat (int i);
                public abstract Guid GetGuid (int i);
@@ -66,8 +108,32 @@ namespace System.Data.Common {
                public abstract long GetInt64 (int i);
                public abstract string GetName (int i);
                public abstract int GetOrdinal (string name);
-               public abstract object GetProviderSpecificValue (int i);
-               public abstract int GetProviderSpecificValues (object[] values);
+
+#if NET_2_0
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public virtual Type GetProviderSpecificFieldType (int i)
+               {
+                       return GetFieldType (i);
+               }
+
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public virtual object GetProviderSpecificValue (int i)
+               {
+                       return GetValue (i);
+               }
+
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public virtual int GetProviderSpecificValues (object[] values)
+               {
+                       return GetValues (values);
+               }
+       
+               protected virtual DbDataReader GetDbDataReader (int ordinal)
+               {
+                       return ((DbDataReader) this [ordinal]);
+               }
+#endif 
+
                public abstract DataTable GetSchemaTable ();
                public abstract string GetString (int i);
                public abstract object GetValue (int i);
@@ -82,8 +148,44 @@ namespace System.Data.Common {
                public abstract bool NextResult ();
                public abstract bool Read ();
 
+                internal static DataTable GetSchemaTableTemplate ()
+               {
+                       Type booleanType = typeof (bool);
+                       Type stringType = typeof (string);
+                       Type intType = typeof (int);
+                       Type typeType = typeof (Type);
+                       Type shortType = typeof (short);
+
+                       DataTable schemaTable = new DataTable ("SchemaTable");
+                       schemaTable.Columns.Add ("ColumnName",       stringType);
+                       schemaTable.Columns.Add ("ColumnOrdinal",    intType);
+                       schemaTable.Columns.Add ("ColumnSize",       intType);
+                       schemaTable.Columns.Add ("NumericPrecision", shortType);
+                       schemaTable.Columns.Add ("NumericScale",     shortType);
+                       schemaTable.Columns.Add ("IsUnique",         booleanType);
+                       schemaTable.Columns.Add ("IsKey",            booleanType);
+                       schemaTable.Columns.Add ("BaseServerName",   stringType);
+                       schemaTable.Columns.Add ("BaseCatalogName",  stringType);
+                       schemaTable.Columns.Add ("BaseColumnName",   stringType);
+                       schemaTable.Columns.Add ("BaseSchemaName",   stringType);
+                       schemaTable.Columns.Add ("BaseTableName",    stringType);
+                       schemaTable.Columns.Add ("DataType",         typeType);
+                       schemaTable.Columns.Add ("AllowDBNull",      booleanType);
+                       schemaTable.Columns.Add ("ProviderType",     intType);
+                       schemaTable.Columns.Add ("IsAliased",        booleanType);
+                       schemaTable.Columns.Add ("IsExpression",     booleanType);
+                       schemaTable.Columns.Add ("IsIdentity",       booleanType);
+                       schemaTable.Columns.Add ("IsAutoIncrement",  booleanType);
+                       schemaTable.Columns.Add ("IsRowVersion",     booleanType);
+                       schemaTable.Columns.Add ("IsHidden",         booleanType);
+                       schemaTable.Columns.Add ("IsLong",           booleanType);
+                       schemaTable.Columns.Add ("IsReadOnly",       booleanType);
+
+                       return schemaTable;
+               }
+
                #endregion // Methods
        }
 }
 
-#endif // NET_2_0
+#endif