Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
UniqueConstraint.cs
Go to the documentation of this file.
3
4namespace System.Data;
5
6[DefaultProperty("ConstraintName")]
7[Editor("Microsoft.VSDesigner.Data.Design.UniqueConstraintEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
9{
10 private DataKey _key;
11
13
14 internal bool _bPrimaryKey;
15
16 internal string _constraintName;
17
18 internal string[] _columnNames;
19
20 internal string[] ColumnNames => _key.GetColumnNames();
21
23
24 [ReadOnly(true)]
25 public virtual DataColumn[] Columns => _key.ToArray();
26
28
29 public bool IsPrimaryKey
30 {
31 get
32 {
33 if (Table == null)
34 {
35 return false;
36 }
37 return this == Table._primaryKey;
38 }
39 }
40
41 internal override bool InCollection
42 {
43 set
44 {
45 base.InCollection = value;
46 if (_key.ColumnsReference.Length == 1)
47 {
49 }
50 }
51 }
52
53 internal DataKey Key => _key;
54
55 [ReadOnly(true)]
56 public override DataTable? Table
57 {
58 get
59 {
60 if (_key.HasValue)
61 {
62 return _key.Table;
63 }
64 return null;
65 }
66 }
67
68 public UniqueConstraint(string? name, DataColumn column)
69 {
70 Create(name, new DataColumn[1] { column });
71 }
72
74 {
75 Create(null, new DataColumn[1] { column });
76 }
77
78 public UniqueConstraint(string? name, DataColumn[] columns)
79 {
80 Create(name, columns);
81 }
82
83 public UniqueConstraint(DataColumn[] columns)
84 {
85 Create(null, columns);
86 }
87
88 [Browsable(false)]
89 public UniqueConstraint(string? name, string[]? columnNames, bool isPrimaryKey)
90 {
91 _constraintName = name;
92 _columnNames = columnNames;
93 _bPrimaryKey = isPrimaryKey;
94 }
95
96 public UniqueConstraint(string? name, DataColumn column, bool isPrimaryKey)
97 {
98 DataColumn[] columns = new DataColumn[1] { column };
99 _bPrimaryKey = isPrimaryKey;
100 Create(name, columns);
101 }
102
103 public UniqueConstraint(DataColumn column, bool isPrimaryKey)
104 {
105 DataColumn[] columns = new DataColumn[1] { column };
106 _bPrimaryKey = isPrimaryKey;
107 Create(null, columns);
108 }
109
110 public UniqueConstraint(string? name, DataColumn[] columns, bool isPrimaryKey)
111 {
112 _bPrimaryKey = isPrimaryKey;
113 Create(name, columns);
114 }
115
116 public UniqueConstraint(DataColumn[] columns, bool isPrimaryKey)
117 {
118 _bPrimaryKey = isPrimaryKey;
119 Create(null, columns);
120 }
121
122 internal void ConstraintIndexClear()
123 {
124 if (_constraintIndex != null)
125 {
127 _constraintIndex = null;
128 }
129 }
130
132 {
133 if (_constraintIndex == null)
134 {
137 }
138 }
139
140 internal override void CheckState()
141 {
143 }
144
145 private void NonVirtualCheckState()
146 {
148 }
149
150 internal override void CheckCanAddToCollection(ConstraintCollection constraints)
151 {
152 }
153
154 internal override bool CanBeRemovedFromCollection(ConstraintCollection constraints, bool fThrowException)
155 {
156 if (Equals(constraints.Table._primaryKey))
157 {
158 if (!fThrowException)
159 {
160 return false;
161 }
162 throw ExceptionBuilder.RemovePrimaryKey(constraints.Table);
163 }
165 while (parentForeignKeyConstraintEnumerator.GetNext())
166 {
167 ForeignKeyConstraint foreignKeyConstraint = parentForeignKeyConstraintEnumerator.GetForeignKeyConstraint();
168 if (_key.ColumnsEqual(foreignKeyConstraint.ParentKey))
169 {
170 if (!fThrowException)
171 {
172 return false;
173 }
174 throw ExceptionBuilder.NeededForForeignKeyConstraint(this, foreignKeyConstraint);
175 }
176 }
177 return true;
178 }
179
180 internal override bool CanEnableConstraint()
181 {
183 {
185 }
186 return true;
187 }
188
189 internal override bool IsConstraintViolated()
190 {
191 bool result = false;
192 Index constraintIndex = ConstraintIndex;
193 if (constraintIndex.HasDuplicates)
194 {
195 object[] uniqueKeyValues = constraintIndex.GetUniqueKeyValues();
196 for (int i = 0; i < uniqueKeyValues.Length; i++)
197 {
198 Range range = constraintIndex.FindRecords((object[])uniqueKeyValues[i]);
199 if (1 >= range.Count)
200 {
201 continue;
202 }
203 DataRow[] rows = constraintIndex.GetRows(range);
204 string text = ExceptionBuilder.UniqueConstraintViolationText(_key.ColumnsReference, (object[])uniqueKeyValues[i]);
205 for (int j = 0; j < rows.Length; j++)
206 {
207 rows[j].RowError = text;
208 DataColumn[] columnsReference = _key.ColumnsReference;
209 foreach (DataColumn column in columnsReference)
210 {
211 rows[j].SetColumnError(column, text);
212 }
213 }
214 result = true;
215 }
216 }
217 return result;
218 }
219
220 internal override void CheckConstraint(DataRow row, DataRowAction action)
221 {
223 {
224 return;
225 }
226 switch (action)
227 {
228 case DataRowAction.Rollback:
229 if (row._tempRecord == -1)
230 {
231 break;
232 }
233 goto case DataRowAction.Change;
234 case DataRowAction.Change:
235 case DataRowAction.Add:
237 {
238 object[] columnValues = row.GetColumnValues(ColumnsReference);
240 }
241 break;
242 }
243 }
244
245 internal override bool ContainsColumn(DataColumn column)
246 {
247 return _key.ContainsColumn(column);
248 }
249
251 {
252 return Clone(destination, ignorNSforTableLookup: false);
253 }
254
255 internal override Constraint Clone(DataSet destination, bool ignorNSforTableLookup)
256 {
257 int num = ((!ignorNSforTableLookup) ? destination.Tables.IndexOf(Table.TableName, Table.Namespace, chekforNull: false) : destination.Tables.IndexOf(Table.TableName));
258 if (num < 0)
259 {
260 return null;
261 }
262 DataTable dataTable = destination.Tables[num];
263 int num2 = ColumnsReference.Length;
264 DataColumn[] array = new DataColumn[num2];
265 for (int i = 0; i < num2; i++)
266 {
267 DataColumn dataColumn = ColumnsReference[i];
268 num = dataTable.Columns.IndexOf(dataColumn.ColumnName);
269 if (num < 0)
270 {
271 return null;
272 }
273 array[i] = dataTable.Columns[num];
274 }
275 UniqueConstraint uniqueConstraint = new UniqueConstraint(ConstraintName, array);
276 foreach (object key in base.ExtendedProperties.Keys)
277 {
278 uniqueConstraint.ExtendedProperties[key] = base.ExtendedProperties[key];
279 }
280 return uniqueConstraint;
281 }
282
284 {
285 int num = ColumnsReference.Length;
286 DataColumn[] array = new DataColumn[num];
287 for (int i = 0; i < num; i++)
288 {
289 DataColumn dataColumn = ColumnsReference[i];
290 int num2 = table.Columns.IndexOf(dataColumn.ColumnName);
291 if (num2 < 0)
292 {
293 return null;
294 }
295 array[i] = table.Columns[num2];
296 }
297 UniqueConstraint uniqueConstraint = new UniqueConstraint(ConstraintName, array);
298 foreach (object key in base.ExtendedProperties.Keys)
299 {
300 uniqueConstraint.ExtendedProperties[key] = base.ExtendedProperties[key];
301 }
302 return uniqueConstraint;
303 }
304
305 private void Create(string constraintName, DataColumn[] columns)
306 {
307 for (int i = 0; i < columns.Length; i++)
308 {
309 if (columns[i].Computed)
310 {
312 }
313 }
314 _key = new DataKey(columns, copyColumns: true);
315 ConstraintName = constraintName;
317 }
318
319 public override bool Equals([NotNullWhen(true)] object? key2)
320 {
321 if (!(key2 is UniqueConstraint))
322 {
323 return false;
324 }
325 return Key.ColumnsEqual(((UniqueConstraint)key2).Key);
326 }
327
328 public override int GetHashCode()
329 {
330 return base.GetHashCode();
331 }
332}
virtual string ConstraintName
Definition Constraint.cs:24
void InternalUnique(bool value)
void SetColumnError(int columnIndex, string? error)
Definition DataRow.cs:587
bool HaveValuesChanged(DataColumn[] columns)
Definition DataRow.cs:969
object[] GetColumnValues(DataColumn[] columns)
Definition DataRow.cs:800
UniqueConstraint _primaryKey
Definition DataTable.cs:124
DataColumnCollection Columns
Definition DataTable.cs:327
static Exception NeededForForeignKeyConstraint(UniqueConstraint key, ForeignKeyConstraint fk)
static Exception ConstraintViolation(string constraint)
static Exception ExpressionInConstraint(DataColumn column)
static string UniqueConstraintViolationText(DataColumn[] columns, object[] values)
static Exception RemovePrimaryKey(DataTable table)
void AddRef()
Definition Index.cs:196
bool CheckUnique()
Definition Index.cs:259
bool IsKeyRecordInIndex(int record)
Definition Index.cs:725
int RemoveRef()
Definition Index.cs:215
DataRow[] GetRows(object[] values)
Definition Index.cs:611
object[] GetUniqueKeyValues()
Definition Index.cs:408
Range FindRecords(object key)
Definition Index.cs:565
bool HasDuplicates
Definition Index.cs:68
UniqueConstraint(DataColumn[] columns, bool isPrimaryKey)
override bool CanBeRemovedFromCollection(ConstraintCollection constraints, bool fThrowException)
UniqueConstraint(string? name, string[]? columnNames, bool isPrimaryKey)
override void CheckCanAddToCollection(ConstraintCollection constraints)
virtual DataColumn[] Columns
UniqueConstraint(DataColumn column, bool isPrimaryKey)
override bool ContainsColumn(DataColumn column)
UniqueConstraint(string? name, DataColumn[] columns)
override Constraint Clone(DataSet destination, bool ignorNSforTableLookup)
UniqueConstraint(DataColumn[] columns)
UniqueConstraint(string? name, DataColumn column)
override void CheckConstraint(DataRow row, DataRowAction action)
UniqueConstraint(DataColumn column)
void Create(string constraintName, DataColumn[] columns)
override bool Equals([NotNullWhen(true)] object? key2)
override Constraint Clone(DataSet destination)
UniqueConstraint(string? name, DataColumn[] columns, bool isPrimaryKey)
UniqueConstraint(string? name, DataColumn column, bool isPrimaryKey)
UniqueConstraint Clone(DataTable table)
Index GetSortIndex()
Definition DataKey.cs:184
string[] GetColumnNames()
Definition DataKey.cs:154
bool ContainsColumn(DataColumn column)
Definition DataKey.cs:117
DataColumn[] ColumnsReference
Definition DataKey.cs:7
bool ColumnsEqual(DataKey key)
Definition DataKey.cs:79
DataColumn[] ToArray()
Definition DataKey.cs:207
DataTable Table
Definition DataKey.cs:11