d11c23c8c61e6e130022ec862c1d556ac10d558f
[mono.git] / mcs / class / referencesource / System.Data / System / Data / SqlClient / SqlBulkCopyColumnMappingCollection.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="SqlBulkCopyMappingCollection.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 // todo: rename the file
10 // Caution! ndp\fx\src\data\netmodule\sources needs to follow this name change
11
12 namespace System.Data.SqlClient
13 {
14     using System;
15     using System.Data;
16     using System.Data.Common;
17     using System.ComponentModel;
18
19     using System.Collections;
20     using System.Diagnostics;
21
22     public sealed class SqlBulkCopyColumnMappingCollection : CollectionBase  {
23
24         private enum MappingSchema {
25             Undefined = 0,
26             NamesNames = 1,
27             NemesOrdinals = 2,
28             OrdinalsNames = 3,
29             OrdinalsOrdinals = 4,
30         }
31
32         private bool _readOnly;
33         private MappingSchema _mappingSchema = MappingSchema.Undefined;
34
35         internal SqlBulkCopyColumnMappingCollection() {
36         }
37
38         public SqlBulkCopyColumnMapping this [int index] {
39             get {
40                 return (SqlBulkCopyColumnMapping)this.List[index];
41             }
42         }
43
44         internal bool ReadOnly {
45             get {
46                 return _readOnly;
47             }
48             set {
49                 _readOnly = value;
50             }
51         }
52
53
54         public SqlBulkCopyColumnMapping Add(SqlBulkCopyColumnMapping bulkCopyColumnMapping) {
55             AssertWriteAccess();
56             Debug.Assert(ADP.IsEmpty(bulkCopyColumnMapping.SourceColumn) || bulkCopyColumnMapping._internalSourceColumnOrdinal == -1, "BulkLoadAmbigousSourceColumn");
57             if (((ADP.IsEmpty(bulkCopyColumnMapping.SourceColumn)) && (bulkCopyColumnMapping.SourceOrdinal == -1))
58                 || ((ADP.IsEmpty(bulkCopyColumnMapping.DestinationColumn))&&(bulkCopyColumnMapping.DestinationOrdinal == -1))) {
59                 throw SQL.BulkLoadNonMatchingColumnMapping();
60             }
61             InnerList.Add(bulkCopyColumnMapping);
62             return bulkCopyColumnMapping;
63         }
64
65         public SqlBulkCopyColumnMapping Add(string sourceColumn, string destinationColumn) {
66             AssertWriteAccess();
67             SqlBulkCopyColumnMapping column = new SqlBulkCopyColumnMapping (sourceColumn, destinationColumn);
68             return Add(column);
69         }
70
71         public SqlBulkCopyColumnMapping Add(int sourceColumnIndex, string destinationColumn) {
72             AssertWriteAccess();
73             SqlBulkCopyColumnMapping column = new SqlBulkCopyColumnMapping (sourceColumnIndex, destinationColumn);
74             return Add(column);
75         }
76
77         public SqlBulkCopyColumnMapping Add(string sourceColumn, int destinationColumnIndex) {
78             AssertWriteAccess();
79             SqlBulkCopyColumnMapping column = new SqlBulkCopyColumnMapping (sourceColumn, destinationColumnIndex);
80             return Add(column);
81         }
82         public SqlBulkCopyColumnMapping Add(int sourceColumnIndex, int destinationColumnIndex) {
83             AssertWriteAccess();
84             SqlBulkCopyColumnMapping column = new SqlBulkCopyColumnMapping (sourceColumnIndex, destinationColumnIndex);
85             return Add(column);
86         }
87
88         private void AssertWriteAccess () {
89             if (ReadOnly) {
90                 throw SQL.BulkLoadMappingInaccessible();
91             }
92         }
93
94         new public void Clear() {
95             AssertWriteAccess();
96             base.Clear();
97         }
98
99         public bool Contains(SqlBulkCopyColumnMapping value) {
100             return (-1 != InnerList.IndexOf(value));
101         }
102
103         public void CopyTo(SqlBulkCopyColumnMapping[] array, int index) {
104             InnerList.CopyTo(array, index);
105         }
106
107         internal void CreateDefaultMapping (int columnCount) {
108             for (int i=0; i<columnCount; i++) {
109                 InnerList.Add(new SqlBulkCopyColumnMapping (i,i));
110             }
111         }
112
113         public int IndexOf(SqlBulkCopyColumnMapping value) {
114             return InnerList.IndexOf(value);
115         }
116
117         public void Insert(int index, SqlBulkCopyColumnMapping value) {
118             AssertWriteAccess();
119             InnerList.Insert(index, value);
120         }
121
122         public void Remove(SqlBulkCopyColumnMapping value) {
123             AssertWriteAccess();
124             InnerList.Remove(value);
125         }
126
127         new public void RemoveAt(int index) {
128             AssertWriteAccess();
129             base.RemoveAt(index);
130         }
131
132         internal void ValidateCollection () {
133             MappingSchema mappingSchema;
134             foreach (SqlBulkCopyColumnMapping a in this) {
135                 if (a.SourceOrdinal != -1) {
136                     if(a.DestinationOrdinal != -1) {
137                         mappingSchema = MappingSchema.OrdinalsOrdinals;
138                     }
139                     else {
140                         mappingSchema = MappingSchema.OrdinalsNames;
141                     }
142                 }
143                 else {
144                     if(a.DestinationOrdinal != -1) {
145                         mappingSchema = MappingSchema.NemesOrdinals;
146                     }
147                     else {
148                         mappingSchema = MappingSchema.NamesNames;
149                     }
150                 }
151
152                 if (_mappingSchema == MappingSchema.Undefined) {
153                     _mappingSchema = mappingSchema;
154                 }
155                 else {
156                     if (_mappingSchema != mappingSchema) {
157                           throw SQL.BulkLoadMappingsNamesOrOrdinalsOnly();
158                     }
159                 }
160             }
161         }
162     }
163 }
164