e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
126 lines
5.5 KiB
C#
126 lines
5.5 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="DBSchemaTable.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">[....]</owner>
|
|
// <owner current="true" primary="false">[....]</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;
|
|
}
|
|
}
|
|
}
|