Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data / System / Data / Common / DBSchemaTable.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="DBSchemaTable.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
8
9 namespace System.Data.Common {
10
11     using System;
12     using System.Data;
13     using System.Data.ProviderBase;
14     using System.Diagnostics;
15     
16     sealed internal class DbSchemaTable {
17
18         private enum ColumnEnum {
19             ColumnName,
20             ColumnOrdinal,
21             ColumnSize,
22             BaseServerName,
23             BaseCatalogName,
24             BaseColumnName,
25             BaseSchemaName,
26             BaseTableName,
27             IsAutoIncrement,
28             IsUnique,
29             IsKey,
30             IsRowVersion,
31             DataType,
32             ProviderSpecificDataType,
33             AllowDBNull,
34             ProviderType,
35             IsExpression,
36             IsHidden,
37             IsLong,
38             IsReadOnly,
39             SchemaMappingUnsortedIndex,
40         }
41
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,
64         };
65
66         internal DataTable dataTable;
67         private DataColumnCollection columns;
68         private DataColumn[] columnCache = new DataColumn[DBCOLUMN_NAME.Length];
69         private bool _returnProviderSpecificTypes;
70
71         internal DbSchemaTable(DataTable dataTable, bool returnProviderSpecificTypes) {
72             this.dataTable = dataTable;
73             this.columns = dataTable.Columns;
74             _returnProviderSpecificTypes = returnProviderSpecificTypes;
75         }
76
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);}}
88
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);}}
94
95         internal DataColumn UnsortedIndex   { get { return CachedDataColumn(ColumnEnum.SchemaMappingUnsortedIndex);}}
96         
97         internal DataColumn DataType {
98             get {
99                 if (_returnProviderSpecificTypes) {
100                     return CachedDataColumn(ColumnEnum.ProviderSpecificDataType, ColumnEnum.DataType);
101                 }
102                 return CachedDataColumn(ColumnEnum.DataType);
103             }
104         }
105
106         private DataColumn CachedDataColumn(ColumnEnum column) {
107             return CachedDataColumn(column, column);
108         }
109         
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]);
116                 }
117                 if (-1 != index) {
118                     dataColumn = columns[index];
119                     columnCache[(int) column] = dataColumn;
120                 }
121             }
122             return dataColumn;
123         }
124     }
125 }