| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- //------------------------------------------------------------------------------
- // <copyright file="DBSchemaTable.cs" company="Microsoft">
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // </copyright>
- // <owner current="true" primary="true">Microsoft</owner>
- // <owner current="true" primary="false">Microsoft</owner>
- //------------------------------------------------------------------------------
- namespace System.Data.Common {
- using System;
- using System.Data;
- using System.Data.ProviderBase;
- using System.Diagnostics;
-
- sealed internal class DbSchemaTable {
- private enum ColumnEnum {
- ColumnName,
- ColumnOrdinal,
- ColumnSize,
- BaseServerName,
- BaseCatalogName,
- BaseColumnName,
- BaseSchemaName,
- BaseTableName,
- IsAutoIncrement,
- IsUnique,
- IsKey,
- IsRowVersion,
- DataType,
- ProviderSpecificDataType,
- AllowDBNull,
- ProviderType,
- IsExpression,
- IsHidden,
- IsLong,
- IsReadOnly,
- SchemaMappingUnsortedIndex,
- }
- static readonly private string[] DBCOLUMN_NAME = new string[] {
- SchemaTableColumn.ColumnName,
- SchemaTableColumn.ColumnOrdinal,
- SchemaTableColumn.ColumnSize,
- SchemaTableOptionalColumn.BaseServerName,
- SchemaTableOptionalColumn.BaseCatalogName,
- SchemaTableColumn.BaseColumnName,
- SchemaTableColumn.BaseSchemaName,
- SchemaTableColumn.BaseTableName,
- SchemaTableOptionalColumn.IsAutoIncrement,
- SchemaTableColumn.IsUnique,
- SchemaTableColumn.IsKey,
- SchemaTableOptionalColumn.IsRowVersion,
- SchemaTableColumn.DataType,
- SchemaTableOptionalColumn.ProviderSpecificDataType,
- SchemaTableColumn.AllowDBNull,
- SchemaTableColumn.ProviderType,
- SchemaTableColumn.IsExpression,
- SchemaTableOptionalColumn.IsHidden,
- SchemaTableColumn.IsLong,
- SchemaTableOptionalColumn.IsReadOnly,
- DbSchemaRow.SchemaMappingUnsortedIndex,
- };
- internal DataTable dataTable;
- private DataColumnCollection columns;
- private DataColumn[] columnCache = new DataColumn[DBCOLUMN_NAME.Length];
- private bool _returnProviderSpecificTypes;
- internal DbSchemaTable(DataTable dataTable, bool returnProviderSpecificTypes) {
- this.dataTable = dataTable;
- this.columns = dataTable.Columns;
- _returnProviderSpecificTypes = returnProviderSpecificTypes;
- }
- internal DataColumn ColumnName { get { return CachedDataColumn(ColumnEnum.ColumnName);}}
- internal DataColumn Size { get { return CachedDataColumn(ColumnEnum.ColumnSize);}}
- internal DataColumn BaseServerName { get { return CachedDataColumn(ColumnEnum.BaseServerName);}}
- internal DataColumn BaseColumnName { get { return CachedDataColumn(ColumnEnum.BaseColumnName);}}
- internal DataColumn BaseTableName { get { return CachedDataColumn(ColumnEnum.BaseTableName);}}
- internal DataColumn BaseCatalogName { get { return CachedDataColumn(ColumnEnum.BaseCatalogName);}}
- internal DataColumn BaseSchemaName { get { return CachedDataColumn(ColumnEnum.BaseSchemaName);}}
- internal DataColumn IsAutoIncrement { get { return CachedDataColumn(ColumnEnum.IsAutoIncrement);}}
- internal DataColumn IsUnique { get { return CachedDataColumn(ColumnEnum.IsUnique);}}
- internal DataColumn IsKey { get { return CachedDataColumn(ColumnEnum.IsKey);}}
- internal DataColumn IsRowVersion { get { return CachedDataColumn(ColumnEnum.IsRowVersion);}}
- internal DataColumn AllowDBNull { get { return CachedDataColumn(ColumnEnum.AllowDBNull);}}
- internal DataColumn IsExpression { get { return CachedDataColumn(ColumnEnum.IsExpression);}}
- internal DataColumn IsHidden { get { return CachedDataColumn(ColumnEnum.IsHidden);}}
- internal DataColumn IsLong { get { return CachedDataColumn(ColumnEnum.IsLong);}}
- internal DataColumn IsReadOnly { get { return CachedDataColumn(ColumnEnum.IsReadOnly);}}
- internal DataColumn UnsortedIndex { get { return CachedDataColumn(ColumnEnum.SchemaMappingUnsortedIndex);}}
-
- internal DataColumn DataType {
- get {
- if (_returnProviderSpecificTypes) {
- return CachedDataColumn(ColumnEnum.ProviderSpecificDataType, ColumnEnum.DataType);
- }
- return CachedDataColumn(ColumnEnum.DataType);
- }
- }
- private DataColumn CachedDataColumn(ColumnEnum column) {
- return CachedDataColumn(column, column);
- }
-
- private DataColumn CachedDataColumn(ColumnEnum column, ColumnEnum column2) {
- DataColumn dataColumn = columnCache[(int) column];
- if (null == dataColumn) {
- int index = columns.IndexOf(DBCOLUMN_NAME[(int) column]);
- if ((-1 == index) && (column != column2)) {
- index = columns.IndexOf(DBCOLUMN_NAME[(int) column2]);
- }
- if (-1 != index) {
- dataColumn = columns[index];
- columnCache[(int) column] = dataColumn;
- }
- }
- return dataColumn;
- }
- }
- }
|