1 //------------------------------------------------------------------------------
2 // <copyright file="DBSchemaTable.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace System.Data.Common {
13 using System.Data.ProviderBase;
14 using System.Diagnostics;
16 sealed internal class DbSchemaTable {
18 private enum ColumnEnum {
32 ProviderSpecificDataType,
39 SchemaMappingUnsortedIndex,
42 static readonly private string[] DBCOLUMN_NAME = new string[] {
43 SchemaTableColumn.ColumnName,
44 SchemaTableColumn.ColumnOrdinal,
45 SchemaTableColumn.ColumnSize,
46 SchemaTableOptionalColumn.BaseServerName,
47 SchemaTableOptionalColumn.BaseCatalogName,
48 SchemaTableColumn.BaseColumnName,
49 SchemaTableColumn.BaseSchemaName,
50 SchemaTableColumn.BaseTableName,
51 SchemaTableOptionalColumn.IsAutoIncrement,
52 SchemaTableColumn.IsUnique,
53 SchemaTableColumn.IsKey,
54 SchemaTableOptionalColumn.IsRowVersion,
55 SchemaTableColumn.DataType,
56 SchemaTableOptionalColumn.ProviderSpecificDataType,
57 SchemaTableColumn.AllowDBNull,
58 SchemaTableColumn.ProviderType,
59 SchemaTableColumn.IsExpression,
60 SchemaTableOptionalColumn.IsHidden,
61 SchemaTableColumn.IsLong,
62 SchemaTableOptionalColumn.IsReadOnly,
63 DbSchemaRow.SchemaMappingUnsortedIndex,
66 internal DataTable dataTable;
67 private DataColumnCollection columns;
68 private DataColumn[] columnCache = new DataColumn[DBCOLUMN_NAME.Length];
69 private bool _returnProviderSpecificTypes;
71 internal DbSchemaTable(DataTable dataTable, bool returnProviderSpecificTypes) {
72 this.dataTable = dataTable;
73 this.columns = dataTable.Columns;
74 _returnProviderSpecificTypes = returnProviderSpecificTypes;
77 internal DataColumn ColumnName { get { return CachedDataColumn(ColumnEnum.ColumnName);}}
78 internal DataColumn Size { get { return CachedDataColumn(ColumnEnum.ColumnSize);}}
79 internal DataColumn BaseServerName { get { return CachedDataColumn(ColumnEnum.BaseServerName);}}
80 internal DataColumn BaseColumnName { get { return CachedDataColumn(ColumnEnum.BaseColumnName);}}
81 internal DataColumn BaseTableName { get { return CachedDataColumn(ColumnEnum.BaseTableName);}}
82 internal DataColumn BaseCatalogName { get { return CachedDataColumn(ColumnEnum.BaseCatalogName);}}
83 internal DataColumn BaseSchemaName { get { return CachedDataColumn(ColumnEnum.BaseSchemaName);}}
84 internal DataColumn IsAutoIncrement { get { return CachedDataColumn(ColumnEnum.IsAutoIncrement);}}
85 internal DataColumn IsUnique { get { return CachedDataColumn(ColumnEnum.IsUnique);}}
86 internal DataColumn IsKey { get { return CachedDataColumn(ColumnEnum.IsKey);}}
87 internal DataColumn IsRowVersion { get { return CachedDataColumn(ColumnEnum.IsRowVersion);}}
89 internal DataColumn AllowDBNull { get { return CachedDataColumn(ColumnEnum.AllowDBNull);}}
90 internal DataColumn IsExpression { get { return CachedDataColumn(ColumnEnum.IsExpression);}}
91 internal DataColumn IsHidden { get { return CachedDataColumn(ColumnEnum.IsHidden);}}
92 internal DataColumn IsLong { get { return CachedDataColumn(ColumnEnum.IsLong);}}
93 internal DataColumn IsReadOnly { get { return CachedDataColumn(ColumnEnum.IsReadOnly);}}
95 internal DataColumn UnsortedIndex { get { return CachedDataColumn(ColumnEnum.SchemaMappingUnsortedIndex);}}
97 internal DataColumn DataType {
99 if (_returnProviderSpecificTypes) {
100 return CachedDataColumn(ColumnEnum.ProviderSpecificDataType, ColumnEnum.DataType);
102 return CachedDataColumn(ColumnEnum.DataType);
106 private DataColumn CachedDataColumn(ColumnEnum column) {
107 return CachedDataColumn(column, column);
110 private DataColumn CachedDataColumn(ColumnEnum column, ColumnEnum column2) {
111 DataColumn dataColumn = columnCache[(int) column];
112 if (null == dataColumn) {
113 int index = columns.IndexOf(DBCOLUMN_NAME[(int) column]);
114 if ((-1 == index) && (column != column2)) {
115 index = columns.IndexOf(DBCOLUMN_NAME[(int) column2]);
118 dataColumn = columns[index];
119 columnCache[(int) column] = dataColumn;