1 //------------------------------------------------------------------------------
2 // <copyright file="DataKey.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 // <owner current="false" primary="false">Microsoft</owner>
8 //------------------------------------------------------------------------------
10 namespace System
.Data
{
12 using System
.Diagnostics
;
13 using System
.ComponentModel
;
15 internal struct DataKey
{
16 private const int maxColumns
= 32;
18 private readonly DataColumn
[] columns
;
21 /// <para>[To be supplied.]</para>
23 internal DataKey(DataColumn
[] columns
, bool copyColumns
) {
25 throw ExceptionBuilder
.ArgumentNull("columns");
27 if (columns
.Length
== 0)
28 throw ExceptionBuilder
.KeyNoColumns();
30 if (columns
.Length
> maxColumns
)
31 throw ExceptionBuilder
.KeyTooManyColumns(maxColumns
);
33 for (int i
= 0; i
< columns
.Length
; i
++) {
34 if (columns
[i
] == null)
35 throw ExceptionBuilder
.ArgumentNull("column");
38 for (int i
= 0; i
< columns
.Length
; i
++) {
39 for (int j
= 0; j
< i
; j
++) {
40 if (columns
[i
] == columns
[j
]) {
41 throw ExceptionBuilder
.KeyDuplicateColumns(columns
[i
].ColumnName
);
47 // Need to make a copy of all columns
48 this.columns
= new DataColumn
[columns
.Length
];
49 for (int i
= 0; i
< columns
.Length
; i
++)
50 this.columns
[i
] = columns
[i
];
53 // take ownership of the array passed in
54 this.columns
= columns
;
59 internal DataColumn
[] ColumnsReference
{
65 internal bool HasValue
{
67 return (null != columns
);
71 internal DataTable Table
{
73 return columns
[0].Table
;
77 internal void CheckState() {
78 DataTable table
= columns
[0].Table
;
81 throw ExceptionBuilder
.ColumnNotInAnyTable();
84 for (int i
= 1; i
< columns
.Length
; i
++) {
85 if (columns
[i
].Table
== null) {
86 throw ExceptionBuilder
.ColumnNotInAnyTable();
88 if (columns
[i
].Table
!= table
) {
89 throw ExceptionBuilder
.KeyTableMismatch();
94 //check to see if this.columns && key2's columns are equal regardless of order
95 internal bool ColumnsEqual(DataKey key
) {
96 return ColumnsEqual(this.columns
, ((DataKey
)key
).columns
);
99 //check to see if columns1 && columns2 are equal regardless of order
100 internal static bool ColumnsEqual(DataColumn
[] column1
, DataColumn
[] column2
) {
102 if (column1
== column2
) {
104 } else if (column1
== null || column2
== null) {
106 } else if (column1
.Length
!= column2
.Length
) {
110 for (i
=0; i
<column1
.Length
; i
++) {
112 for (j
=0; j
<column2
.Length
; j
++) {
113 if (column1
[i
].Equals(column2
[j
])) {
126 internal bool ContainsColumn(DataColumn column
) {
127 for (int i
= 0; i
< columns
.Length
; i
++) {
128 if (column
== columns
[i
]) {
135 public override int GetHashCode() {
136 Debug
.Assert(false, "don't put DataKey into a Hashtable");
137 return base.GetHashCode();
140 public static bool operator==(DataKey x
, DataKey y
) {
141 return x
.Equals((object)y
);
144 public static bool operator!=(DataKey x
, DataKey y
) {
145 return !x
.Equals((object)y
);
148 public override bool Equals(object value) {
149 Debug
.Assert(false, "need to directly call Equals(DataKey)");
150 return Equals((DataKey
)value);
153 internal bool Equals(DataKey
value) {
154 //check to see if this.columns && key2's columns are equal...
155 DataColumn
[] column1
=this.columns
;
156 DataColumn
[] column2
=value.columns
;
158 if (column1
== column2
) {
161 else if (column1
== null || column2
== null) {
164 else if (column1
.Length
!= column2
.Length
) {
168 for (int i
= 0; i
<column1
.Length
; i
++) {
169 if (!column1
[i
].Equals(column2
[i
])) {
177 internal string[] GetColumnNames() {
178 string[] values
= new string[columns
.Length
];
179 for(int i
= 0; i
< columns
.Length
; ++i
) {
180 values
[i
] = columns
[i
].ColumnName
;
185 internal IndexField
[] GetIndexDesc() {
186 IndexField
[] indexDesc
= new IndexField
[columns
.Length
];
187 for (int i
= 0; i
< columns
.Length
; i
++) {
188 indexDesc
[i
] = new IndexField(columns
[i
], false);
193 internal object[] GetKeyValues(int record
) {
194 object[] values
= new object[columns
.Length
];
195 for (int i
= 0; i
< columns
.Length
; i
++) {
196 values
[i
] = columns
[i
][record
];
201 internal Index
GetSortIndex() {
202 return GetSortIndex(DataViewRowState
.CurrentRows
);
205 internal Index
GetSortIndex(DataViewRowState recordStates
) {
206 IndexField
[] indexDesc
= GetIndexDesc();
207 return columns
[0].Table
.GetIndex(indexDesc
, recordStates
, (IFilter
)null);
210 internal bool RecordsEqual(int record1
, int record2
) {
211 for (int i
= 0; i
< columns
.Length
; i
++) {
212 if (columns
[i
].Compare(record1
, record2
) != 0) {
219 internal DataColumn
[] ToArray() {
220 DataColumn
[] values
= new DataColumn
[columns
.Length
];
221 for(int i
= 0; i
< columns
.Length
; ++i
) {
222 values
[i
] = columns
[i
];