Browse Source

enable provider specific caches

svn path=/trunk/mcs/; revision=57596
Konstantin Triger 20 years ago
parent
commit
7bb89b5ff0

+ 275 - 258
mcs/class/System.Data/System.Data.ProviderBase.jvm/AbstractDataReader.cs

@@ -57,7 +57,7 @@ namespace System.Data.ProviderBase
 		[Flags]
 		private enum ReaderState { Uninitialized = 0, Empty = 1, HasRows = 2, FirstRed = 4, Eof = 8, Fetching = 16 };
 
-		internal enum SCHEMA_TABLE { ColumnName,
+		protected internal enum SCHEMA_TABLE { ColumnName,
 			ColumnOrdinal,
 			ColumnSize,
 			NumericPrecision,
@@ -743,107 +743,88 @@ namespace System.Data.ProviderBase
 			}
 		}
 
+		protected virtual IReaderCacheContainer CreateReaderCacheContainer(int jdbcType, int columnIndex) {
+			switch ((DbConvert.JavaSqlTypes)jdbcType) {
+				case DbConvert.JavaSqlTypes.ARRAY :
+					return new ArrayReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.BIGINT :
+					return new Int64ReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.BINARY :
+				case DbConvert.JavaSqlTypes.VARBINARY :
+				case DbConvert.JavaSqlTypes.LONGVARBINARY :
+					return new BytesReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.BIT :
+					return new BooleanReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.BLOB :
+					return new BlobReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.CHAR :						
+					if (String.CompareOrdinal("uniqueidentifier", ResultsMetaData.getColumnTypeName(columnIndex)) == 0) {
+						return new GuidReaderCacheContainer();
+					}
+					else {
+						return new StringReaderCacheContainer();
+					}
+				case DbConvert.JavaSqlTypes.CLOB :
+					return new ClobReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.TIME :
+					return new TimeSpanReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.DATE :
+					AbstractDBConnection conn = (AbstractDBConnection)((ICloneable)_command.Connection);
+					string driverName = conn.JdbcConnection.getMetaData().getDriverName();
+
+					if (driverName.StartsWith("PostgreSQL")) {
+						return new DateTimeReaderCacheContainer();
+					}
+					else
+						goto case DbConvert.JavaSqlTypes.TIMESTAMP;
+				case DbConvert.JavaSqlTypes.TIMESTAMP :				
+					return new TimestampReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.DECIMAL :
+				case DbConvert.JavaSqlTypes.NUMERIC :
+					// jdbc driver for oracle identitfies both FLOAT and NUMBEr columns as 
+					// java.sql.Types.NUMERIC (2), columnTypeName NUMBER, columnClassName java.math.BigDecimal 
+					// therefore we relay on scale
+					int scale = ResultsMetaData.getScale(columnIndex);
+					if (scale == -127) {
+						// Oracle db type FLOAT
+						return new DoubleReaderCacheContainer();
+					}
+					else {
+						return new DecimalReaderCacheContainer();
+					}
+				case DbConvert.JavaSqlTypes.DOUBLE :
+				case DbConvert.JavaSqlTypes.FLOAT :
+					return new DoubleReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.INTEGER :
+					return new Int32ReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.LONGVARCHAR :
+				case DbConvert.JavaSqlTypes.VARCHAR :
+					return new StringReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.NULL :
+					return new NullReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.REAL :
+					return new FloatReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.REF :
+					return new RefReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.SMALLINT :
+					return new Int16ReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.TINYINT :
+					return new ByteReaderCacheContainer();
+				case DbConvert.JavaSqlTypes.DISTINCT :
+				case DbConvert.JavaSqlTypes.JAVA_OBJECT :
+				case DbConvert.JavaSqlTypes.OTHER :
+				case DbConvert.JavaSqlTypes.STRUCT :
+				default :
+					return new ObjectReaderCacheContainer();
+			}
+		}
+
 		private IReaderCacheContainer[] CreateReaderCache()
 		{
 			try {
 				IReaderCacheContainer[] readerCache = new IReaderCacheContainer[FieldCount];
-				for(int i=0; i < readerCache.Length; i++) {
-					DbConvert.JavaSqlTypes javaSqlType = (DbConvert.JavaSqlTypes) ResultsMetaData.getColumnType(i + 1);
-					switch (javaSqlType) {
-						case DbConvert.JavaSqlTypes.ARRAY :
-							readerCache[i] = new ArrayReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.BIGINT :
-							readerCache[i] = new Int64ReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.BINARY :
-						case DbConvert.JavaSqlTypes.VARBINARY :
-						case DbConvert.JavaSqlTypes.LONGVARBINARY :
-							readerCache[i] = new BytesReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.BIT :
-							readerCache[i] = new BooleanReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.BLOB :
-							readerCache[i] = new BlobReaderCacheContainer();
-							break;	
-						case DbConvert.JavaSqlTypes.CHAR :						
-							if ("uniqueidentifier".Equals(ResultsMetaData.getColumnTypeName(i + 1))) {
-								readerCache[i] = new GuidReaderCacheContainer();
-							}
-							else {
-								readerCache[i] = new StringReaderCacheContainer();
-							}
-							break;
-						case DbConvert.JavaSqlTypes.CLOB :
-							readerCache[i] = new ClobReaderCacheContainer();
-							break;		
-						case DbConvert.JavaSqlTypes.TIME :
-							readerCache[i] = new TimeSpanReaderCacheContainer();
-							break;	
-						case DbConvert.JavaSqlTypes.DATE :
-							AbstractDBConnection conn = (AbstractDBConnection)((ICloneable)_command.Connection);
-							string driverName = conn.JdbcConnection.getMetaData().getDriverName();
-
-							if (driverName.StartsWith("PostgreSQL")) {
-								readerCache[i] = new DateTimeReaderCacheContainer();
-								break;
-							}
-							else
-								goto case DbConvert.JavaSqlTypes.TIMESTAMP;
-						case DbConvert.JavaSqlTypes.TIMESTAMP :				
-							readerCache[i] = new TimestampReaderCacheContainer();
-							break;		
-						case DbConvert.JavaSqlTypes.DECIMAL :
-						case DbConvert.JavaSqlTypes.NUMERIC :
-							// jdbc driver for oracle identitfies both FLOAT and NUMBEr columns as 
-							// java.sql.Types.NUMERIC (2), columnTypeName NUMBER, columnClassName java.math.BigDecimal 
-							// therefore we relay on scale
-							int scale = ResultsMetaData.getScale(i + 1);
-							if (scale == -127) {
-								// Oracle db type FLOAT
-								readerCache[i] = new DoubleReaderCacheContainer();
-							}
-							else {
-								readerCache[i] = new DecimalReaderCacheContainer();
-							}
-							break;		
-						case DbConvert.JavaSqlTypes.DOUBLE :
-						case DbConvert.JavaSqlTypes.FLOAT :
-							readerCache[i] = new DoubleReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.INTEGER :
-							readerCache[i] = new Int32ReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.LONGVARCHAR :
-						case DbConvert.JavaSqlTypes.VARCHAR :
-							readerCache[i] = new StringReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.NULL :
-							readerCache[i] = new NullReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.REAL :
-							readerCache[i] = new FloatReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.REF :
-							readerCache[i] = new RefReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.SMALLINT :
-							readerCache[i] = new Int16ReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.TINYINT :
-							readerCache[i] = new ByteReaderCacheContainer();
-							break;
-						case DbConvert.JavaSqlTypes.DISTINCT :
-						case DbConvert.JavaSqlTypes.JAVA_OBJECT :
-						case DbConvert.JavaSqlTypes.OTHER :
-						case DbConvert.JavaSqlTypes.STRUCT :
-						default :
-							readerCache[i] = new ObjectReaderCacheContainer();
-							break;
-					}
-					//				((ReaderCacheContainerBase)readerCache[i])._jdbcType = (int) javaSqlType;
-				}
+				for(int i=1; i <= readerCache.Length; i++)
+					readerCache[i-1] = CreateReaderCacheContainer(ResultsMetaData.getColumnType(i), i);
 
 				return readerCache;
 			}
@@ -879,6 +860,200 @@ namespace System.Data.ProviderBase
 			throw new NotSupportedException();
 		}
 
+		protected virtual void SetSchemaType(DataRow schemaRow, ResultSetMetaData metaData, int columnIndex) {
+			DbConvert.JavaSqlTypes columnType = (DbConvert.JavaSqlTypes)metaData.getColumnType(columnIndex);
+
+			switch (columnType) {
+				case DbConvert.JavaSqlTypes.ARRAY: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Array);
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.BIGINT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt64;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.BINARY: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.BIT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfBoolean;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.BLOB: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.CHAR: {
+					// FIXME : specific for Microsoft SQl Server driver
+					if (metaData.getColumnTypeName(columnIndex).Equals("uniqueidentifier")) {
+						schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.Guid;
+						schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfGuid;
+						schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					}
+					else {
+						schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+						schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
+						schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					}
+					break;
+				}
+				case DbConvert.JavaSqlTypes.CLOB: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString; // instead og .java.sql.Clob
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.DATE: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+					//                else if(DbConvert.JavaSqlTypes.DISTINCT)
+					//                {
+					//                    schemaRow ["ProviderType = (int)GetProviderType((int)columnType);
+					//                    schemaRow ["DataType = typeof (?);
+					//                    schemaRow ["IsLong = false;
+					//                }
+				case DbConvert.JavaSqlTypes.DOUBLE: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble; // was typeof(float)
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.FLOAT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.REAL: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfFloat;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.INTEGER: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt32;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.JAVA_OBJECT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.LONGVARBINARY: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.LONGVARCHAR: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.DECIMAL:
+				case DbConvert.JavaSqlTypes.NUMERIC: {
+					int scale = ResultsMetaData.getScale(columnIndex);
+					if (scale == -127) {
+						schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+						schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble;
+						schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					}
+					else {
+						schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+						schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDecimal;
+						schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					}
+					break;
+				}
+				case DbConvert.JavaSqlTypes.REF: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Ref);
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.SMALLINT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt16;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.STRUCT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Struct);
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.TIME: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfTimespan;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.TIMESTAMP: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.TINYINT: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByte;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.VARBINARY: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+				case DbConvert.JavaSqlTypes.VARCHAR: {
+					// FIXME : specific for Microsoft SQl Server driver
+					if (metaData.getColumnTypeName(columnIndex).Equals("sql_variant")) {
+						schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
+						schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
+						schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					}
+					else {
+						schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
+						schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;// (char[]);
+						schemaRow [(int)SCHEMA_TABLE.IsLong] = false;//true;
+					}
+					break;
+				}
+					//			else if(columnType == -8 && metaData.getColumnTypeName(columnIndex).Equals("ROWID")) {
+					//				// FIXME : specific for Oracle JDBC driver : OracleTypes.ROWID
+					//				schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.String;
+					//				schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
+					//				schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
+					//			}
+				default: {
+					schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
+					schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
+					schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
+					break;
+				}
+			}
+		}
+
 		public override DataTable GetSchemaTable()
 		{
 			if (SchemaTable.Rows != null && SchemaTable.Rows.Count > 0) {
@@ -994,166 +1169,8 @@ namespace System.Data.ProviderBase
 					row [(int)SCHEMA_TABLE.IsHidden] = false;
 					row [(int)SCHEMA_TABLE.IsReadOnly] = metaData.isReadOnly(i);
 
-					int columnType = metaData.getColumnType(i);
-					string columnTypeName = metaData.getColumnTypeName(i);
-					if(columnType == Types.ARRAY) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Array);
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.BIGINT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt64;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.BINARY) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.BIT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfBoolean;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.BLOB) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.CHAR) {
-						// FIXME : specific for Microsoft SQl Server driver
-						if (columnTypeName.Equals("uniqueidentifier")) {
-							row [(int)SCHEMA_TABLE.ProviderType] = DbType.Guid;
-							row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfGuid;
-							row [(int)SCHEMA_TABLE.IsLong] = false;
-						}
-						else {
-							row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-							row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
-							row [(int)SCHEMA_TABLE.IsLong] = false;
-						}
-					}
-					else if(columnType == Types.CLOB) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString; // instead og .java.sql.Clob
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.DATE) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.DECIMAL) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDecimal;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-						//                else if(columnType == Types.DISTINCT)
-						//                {
-						//                    row ["ProviderType = (int)GetProviderType(columnType);
-						//                    row ["DataType = typeof (?);
-						//                    row ["IsLong = false;
-						//                }
-					else if(columnType == Types.DOUBLE) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble; // was typeof(float)
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.FLOAT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.REAL) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfFloat;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.INTEGER) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt32;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.JAVA_OBJECT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.LONGVARBINARY) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.LONGVARCHAR) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.NUMERIC) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDecimal;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.REF) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Ref);
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.SMALLINT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt16;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.STRUCT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Struct);
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.TIME) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfTimespan;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.TIMESTAMP) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.TINYINT) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByte;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else if(columnType == Types.VARBINARY) {
-						row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
-					else if(columnType == Types.VARCHAR) {
-						// FIXME : specific for Microsoft SQl Server driver
-						if (columnTypeName.Equals("sql_variant")) {
-							row [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
-							row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
-							row [(int)SCHEMA_TABLE.IsLong] = false;
-						}
-						else {
-							row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
-							row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;// (char[]);
-							row [(int)SCHEMA_TABLE.IsLong] = false;//true;
-						}
-					}
-					else if(columnType == -8 && columnTypeName.Equals("ROWID")) {
-						// FIXME : specific for Oracle JDBC driver : OracleTypes.ROWID
-						row [(int)SCHEMA_TABLE.ProviderType] = DbType.String;
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
-						row [(int)SCHEMA_TABLE.IsLong] = false;
-					}
-					else {
-						row [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
-						row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
-						row [(int)SCHEMA_TABLE.IsLong] = true;
-					}
+					SetSchemaType(row, metaData, i);
+
 					SchemaTable.Rows.Add (row);
 				}
 			}

+ 4 - 0
mcs/class/System.Data/System.Data.ProviderBase.jvm/ChangeLog

@@ -1,3 +1,7 @@
+2006-03-05  Konstantin Triger <[email protected]>
+
+	* AbstractDataReader.cs, ReaderCache.cs: enable provider specific caches.
+
 2006-02-26  Konstantin Triger <[email protected]>
 
 	* AbstractDataReader.cs: Prevent recursion when GetXXX is overriden and GetXXXSafe is called.

+ 1 - 1
mcs/class/System.Data/System.Data.ProviderBase.jvm/ReaderCache.cs

@@ -42,7 +42,7 @@ namespace System.Data.ProviderBase
 		object GetValue();
 	}
 
-	internal abstract class ReaderCacheContainerBase : IReaderCacheContainer
+	public abstract class ReaderCacheContainerBase : IReaderCacheContainer
 	{
 		#region Fields