Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ConstraintCollection.cs
Go to the documentation of this file.
5
6namespace System.Data;
7
8[DefaultEvent("CollectionChanged")]
9[Editor("Microsoft.VSDesigner.Data.Design.ConstraintsCollectionEditor, 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")]
11{
12 private readonly DataTable _table;
13
14 private readonly ArrayList _list = new ArrayList();
15
16 private int _defaultNameIndex = 1;
17
18 private CollectionChangeEventHandler _onCollectionChanged;
19
21
23
24 protected override ArrayList List => _list;
25
26 public Constraint this[int index]
27 {
28 get
29 {
30 if (index >= 0 && index < List.Count)
31 {
32 return (Constraint)List[index];
33 }
35 }
36 }
37
38 internal DataTable Table => _table;
39
40 public Constraint? this[string? name]
41 {
42 get
43 {
44 int num = InternalIndexOf(name);
45 if (num == -2)
46 {
48 }
49 if (num >= 0)
50 {
51 return (Constraint)List[num];
52 }
53 return null;
54 }
55 }
56
68
70 {
71 _table = table;
72 }
73
74 public void Add(Constraint constraint)
75 {
76 Add(constraint, addUniqueWhenAddingForeign: true);
77 }
78
79 internal void Add(Constraint constraint, bool addUniqueWhenAddingForeign)
80 {
81 if (constraint == null)
82 {
83 throw ExceptionBuilder.ArgumentNull("constraint");
84 }
85 Constraint constraint2 = FindConstraint(constraint);
86 if (constraint2 != null)
87 {
89 }
90 if (1 < _table.NestedParentRelations.Length && !AutoGenerated(constraint))
91 {
93 }
94 if (constraint is UniqueConstraint)
95 {
96 if (((UniqueConstraint)constraint)._bPrimaryKey && Table._primaryKey != null)
97 {
99 }
101 }
102 else if (constraint is ForeignKeyConstraint)
103 {
104 ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)constraint;
105 if (addUniqueWhenAddingForeign)
106 {
107 UniqueConstraint uniqueConstraint = foreignKeyConstraint.RelatedTable.Constraints.FindKeyConstraint(foreignKeyConstraint.RelatedColumnsReference);
108 if (uniqueConstraint == null)
109 {
110 if (constraint.ConstraintName.Length == 0)
111 {
112 constraint.ConstraintName = AssignName();
113 }
114 else
115 {
116 RegisterName(constraint.ConstraintName);
117 }
118 uniqueConstraint = new UniqueConstraint(foreignKeyConstraint.RelatedColumnsReference);
119 foreignKeyConstraint.RelatedTable.Constraints.Add(uniqueConstraint);
120 }
121 }
123 }
124 BaseAdd(constraint);
125 ArrayAdd(constraint);
127 if (constraint is UniqueConstraint && ((UniqueConstraint)constraint)._bPrimaryKey)
128 {
129 Table.PrimaryKey = ((UniqueConstraint)constraint).ColumnsReference;
130 }
131 }
132
133 public Constraint Add(string? name, DataColumn[] columns, bool primaryKey)
134 {
135 UniqueConstraint uniqueConstraint = new UniqueConstraint(name, columns);
136 Add(uniqueConstraint);
137 if (primaryKey)
138 {
139 Table.PrimaryKey = columns;
140 }
141 return uniqueConstraint;
142 }
143
144 public Constraint Add(string? name, DataColumn column, bool primaryKey)
145 {
146 UniqueConstraint uniqueConstraint = new UniqueConstraint(name, column);
147 Add(uniqueConstraint);
148 if (primaryKey)
149 {
150 Table.PrimaryKey = uniqueConstraint.ColumnsReference;
151 }
152 return uniqueConstraint;
153 }
154
155 public Constraint Add(string? name, DataColumn primaryKeyColumn, DataColumn foreignKeyColumn)
156 {
157 ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(name, primaryKeyColumn, foreignKeyColumn);
158 Add(foreignKeyConstraint);
159 return foreignKeyConstraint;
160 }
161
162 public Constraint Add(string? name, DataColumn[] primaryKeyColumns, DataColumn[] foreignKeyColumns)
163 {
164 ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(name, primaryKeyColumns, foreignKeyColumns);
165 Add(foreignKeyConstraint);
166 return foreignKeyConstraint;
167 }
168
169 public void AddRange(Constraint[]? constraints)
170 {
172 {
173 _delayLoadingConstraints = constraints;
175 }
176 else
177 {
178 if (constraints == null)
179 {
180 return;
181 }
182 foreach (Constraint constraint in constraints)
183 {
184 if (constraint != null)
185 {
186 Add(constraint);
187 }
188 }
189 }
190 }
191
192 private void AddUniqueConstraint(UniqueConstraint constraint)
193 {
194 DataColumn[] columnsReference = constraint.ColumnsReference;
195 for (int i = 0; i < columnsReference.Length; i++)
196 {
197 if (columnsReference[i].Table != _table)
198 {
200 }
201 }
202 constraint.ConstraintIndexInitialize();
203 if (!constraint.CanEnableConstraint())
204 {
205 constraint.ConstraintIndexClear();
207 }
208 }
209
211 {
212 if (!constraint.CanEnableConstraint())
213 {
215 }
216 constraint.CheckCanAddToCollection(this);
217 }
218
219 private bool AutoGenerated(Constraint constraint)
220 {
221 if (constraint is ForeignKeyConstraint fk)
222 {
223 return XmlTreeGen.AutoGenerated(fk, checkRelation: false);
224 }
225 UniqueConstraint unique = (UniqueConstraint)constraint;
226 return XmlTreeGen.AutoGenerated(unique);
227 }
228
229 private void ArrayAdd(Constraint constraint)
230 {
231 List.Add(constraint);
232 }
233
234 private void ArrayRemove(Constraint constraint)
235 {
236 List.Remove(constraint);
237 }
238
239 internal string AssignName()
240 {
241 string result = MakeName(_defaultNameIndex);
243 return result;
244 }
245
246 private void BaseAdd(Constraint constraint)
247 {
248 if (constraint == null)
249 {
250 throw ExceptionBuilder.ArgumentNull("constraint");
251 }
252 if (constraint.ConstraintName.Length == 0)
253 {
254 constraint.ConstraintName = AssignName();
255 }
256 else
257 {
258 RegisterName(constraint.ConstraintName);
259 }
260 constraint.InCollection = true;
261 }
262
263 private void BaseGroupSwitch(Constraint[] oldArray, int oldLength, Constraint[] newArray, int newLength)
264 {
265 int num = 0;
266 for (int i = 0; i < oldLength; i++)
267 {
268 bool flag = false;
269 for (int j = num; j < newLength; j++)
270 {
271 if (oldArray[i] == newArray[j])
272 {
273 if (num == j)
274 {
275 num++;
276 }
277 flag = true;
278 break;
279 }
280 }
281 if (!flag)
282 {
283 BaseRemove(oldArray[i]);
284 List.Remove(oldArray[i]);
285 }
286 }
287 for (int k = 0; k < newLength; k++)
288 {
289 if (!newArray[k].InCollection)
290 {
291 BaseAdd(newArray[k]);
292 }
293 List.Add(newArray[k]);
294 }
295 }
296
297 private void BaseRemove(Constraint constraint)
298 {
299 if (constraint == null)
300 {
301 throw ExceptionBuilder.ArgumentNull("constraint");
302 }
303 if (constraint.Table != _table)
304 {
306 }
307 UnregisterName(constraint.ConstraintName);
308 constraint.InCollection = false;
309 if (constraint is UniqueConstraint)
310 {
311 for (int i = 0; i < Table.ChildRelations.Count; i++)
312 {
313 DataRelation dataRelation = Table.ChildRelations[i];
314 if (dataRelation.ParentKeyConstraint == constraint)
315 {
316 dataRelation.SetParentKeyConstraint(null);
317 }
318 }
319 ((UniqueConstraint)constraint).ConstraintIndexClear();
320 }
321 else
322 {
323 if (!(constraint is ForeignKeyConstraint))
324 {
325 return;
326 }
327 for (int j = 0; j < Table.ParentRelations.Count; j++)
328 {
329 DataRelation dataRelation2 = Table.ParentRelations[j];
330 if (dataRelation2.ChildKeyConstraint == constraint)
331 {
332 dataRelation2.SetChildKeyConstraint(null);
333 }
334 }
335 }
336 }
337
338 public bool CanRemove(Constraint constraint)
339 {
340 return CanRemove(constraint, fThrowException: false);
341 }
342
343 internal bool CanRemove(Constraint constraint, bool fThrowException)
344 {
345 return constraint.CanBeRemovedFromCollection(this, fThrowException);
346 }
347
348 public void Clear()
349 {
350 _table.PrimaryKey = null;
351 for (int i = 0; i < _table.ParentRelations.Count; i++)
352 {
353 _table.ParentRelations[i].SetChildKeyConstraint(null);
354 }
355 for (int j = 0; j < _table.ChildRelations.Count; j++)
356 {
357 _table.ChildRelations[j].SetParentKeyConstraint(null);
358 }
360 {
363 }
364 int count = List.Count;
366 List.CopyTo(array, 0);
367 try
368 {
370 }
372 {
374 List.Clear();
375 for (int k = 0; k < count; k++)
376 {
377 List.Add(array[k]);
378 }
379 throw;
380 }
381 List.Clear();
383 }
384
385 public bool Contains(string? name)
386 {
387 return InternalIndexOf(name) >= 0;
388 }
389
390 internal bool Contains(string name, bool caseSensitive)
391 {
392 if (!caseSensitive)
393 {
394 return Contains(name);
395 }
396 int num = InternalIndexOf(name);
397 if (num < 0)
398 {
399 return false;
400 }
401 return name == ((Constraint)List[num]).ConstraintName;
402 }
403
404 public void CopyTo(Constraint[] array, int index)
405 {
406 if (array == null)
407 {
408 throw ExceptionBuilder.ArgumentNull("array");
409 }
410 if (index < 0)
411 {
413 }
414 if (array.Length - index < _list.Count)
415 {
417 }
418 for (int i = 0; i < _list.Count; i++)
419 {
420 array[index + i] = (Constraint)_list[i];
421 }
422 }
423
425 {
426 int count = List.Count;
427 for (int i = 0; i < count; i++)
428 {
429 if (((Constraint)List[i]).Equals(constraint))
430 {
431 return (Constraint)List[i];
432 }
433 }
434 return null;
435 }
436
438 {
439 int count = List.Count;
440 for (int i = 0; i < count; i++)
441 {
442 if (List[i] is UniqueConstraint { Key: var key } uniqueConstraint && CompareArrays(key.ColumnsReference, columns))
443 {
444 return uniqueConstraint;
445 }
446 }
447 return null;
448 }
449
451 {
452 int count = List.Count;
453 for (int i = 0; i < count; i++)
454 {
455 if (List[i] is UniqueConstraint { Key: var key } uniqueConstraint && key.ColumnsReference.Length == 1 && uniqueConstraint.Key.ColumnsReference[0] == column)
456 {
457 return uniqueConstraint;
458 }
459 }
460 return null;
461 }
462
463 internal ForeignKeyConstraint FindForeignKeyConstraint(DataColumn[] parentColumns, DataColumn[] childColumns)
464 {
465 int count = List.Count;
466 for (int i = 0; i < count; i++)
467 {
468 if (List[i] is ForeignKeyConstraint { ParentKey: var parentKey } foreignKeyConstraint && CompareArrays(parentKey.ColumnsReference, parentColumns) && CompareArrays(foreignKeyConstraint.ChildKey.ColumnsReference, childColumns))
469 {
470 return foreignKeyConstraint;
471 }
472 }
473 return null;
474 }
475
476 private static bool CompareArrays(DataColumn[] a1, DataColumn[] a2)
477 {
478 if (a1.Length != a2.Length)
479 {
480 return false;
481 }
482 for (int i = 0; i < a1.Length; i++)
483 {
484 bool flag = false;
485 for (int j = 0; j < a2.Length; j++)
486 {
487 if (a1[i] == a2[j])
488 {
489 flag = true;
490 break;
491 }
492 }
493 if (!flag)
494 {
495 return false;
496 }
497 }
498 return true;
499 }
500
501 public int IndexOf(Constraint? constraint)
502 {
503 if (constraint != null)
504 {
505 int count = Count;
506 for (int i = 0; i < count; i++)
507 {
508 if (constraint == (Constraint)List[i])
509 {
510 return i;
511 }
512 }
513 }
514 return -1;
515 }
516
517 public int IndexOf(string? constraintName)
518 {
519 int num = InternalIndexOf(constraintName);
520 if (num >= 0)
521 {
522 return num;
523 }
524 return -1;
525 }
526
527 internal int InternalIndexOf(string constraintName)
528 {
529 int num = -1;
530 if (constraintName != null && 0 < constraintName.Length)
531 {
532 int count = List.Count;
533 int num2 = 0;
534 for (int i = 0; i < count; i++)
535 {
536 Constraint constraint = (Constraint)List[i];
537 switch (NamesEqual(constraint.ConstraintName, constraintName, fCaseSensitive: false, _table.Locale))
538 {
539 case 1:
540 return i;
541 case -1:
542 num = ((num == -1) ? i : (-2));
543 break;
544 }
545 }
546 }
547 return num;
548 }
549
550 private string MakeName(int index)
551 {
552 if (1 == index)
553 {
554 return "Constraint1";
555 }
556 return "Constraint" + index.ToString(CultureInfo.InvariantCulture);
557 }
558
560 {
561 _onCollectionChanged?.Invoke(this, ccevent);
562 }
563
564 internal void RegisterName(string name)
565 {
566 int count = List.Count;
567 for (int i = 0; i < count; i++)
568 {
569 if (NamesEqual(name, ((Constraint)List[i]).ConstraintName, fCaseSensitive: true, _table.Locale) != 0)
570 {
571 throw ExceptionBuilder.DuplicateConstraintName(((Constraint)List[i]).ConstraintName);
572 }
573 }
574 if (NamesEqual(name, MakeName(_defaultNameIndex), fCaseSensitive: true, _table.Locale) != 0)
575 {
577 }
578 }
579
580 public void Remove(Constraint constraint)
581 {
582 if (constraint == null)
583 {
584 throw ExceptionBuilder.ArgumentNull("constraint");
585 }
586 if (CanRemove(constraint, fThrowException: true))
587 {
588 BaseRemove(constraint);
589 ArrayRemove(constraint);
590 if (constraint is UniqueConstraint && ((UniqueConstraint)constraint).IsPrimaryKey)
591 {
592 Table.PrimaryKey = null;
593 }
595 }
596 }
597
598 public void RemoveAt(int index)
599 {
600 Constraint constraint = this[index];
601 if (constraint == null)
602 {
604 }
605 Remove(constraint);
606 }
607
608 public void Remove(string name)
609 {
610 Constraint constraint = this[name];
611 if (constraint == null)
612 {
614 }
615 Remove(constraint);
616 }
617
618 internal void UnregisterName(string name)
619 {
620 if (NamesEqual(name, MakeName(_defaultNameIndex - 1), fCaseSensitive: true, _table.Locale) != 0)
621 {
622 do
623 {
625 }
627 }
628 }
629
630 internal void FinishInitConstraints()
631 {
632 if (_delayLoadingConstraints == null)
633 {
634 return;
635 }
636 for (int i = 0; i < _delayLoadingConstraints.Length; i++)
637 {
638 int num;
641 {
643 {
644 continue;
645 }
647 if (uniqueConstraint._columnNames == null)
648 {
649 Add(uniqueConstraint);
650 continue;
651 }
652 num = uniqueConstraint._columnNames.Length;
653 array = new DataColumn[num];
654 for (int j = 0; j < num; j++)
655 {
656 array[j] = _table.Columns[uniqueConstraint._columnNames[j]];
657 }
658 if (uniqueConstraint._bPrimaryKey)
659 {
660 if (_table._primaryKey != null)
661 {
663 }
664 Add(uniqueConstraint.ConstraintName, array, primaryKey: true);
665 }
666 else
667 {
668 UniqueConstraint constraint = new UniqueConstraint(uniqueConstraint._constraintName, array);
669 if (FindConstraint(constraint) == null)
670 {
671 Add(constraint);
672 }
673 }
674 continue;
675 }
677 if (foreignKeyConstraint._parentColumnNames == null || foreignKeyConstraint._childColumnNames == null)
678 {
679 Add(foreignKeyConstraint);
680 continue;
681 }
682 if (_table.DataSet == null)
683 {
685 continue;
686 }
687 num = foreignKeyConstraint._parentColumnNames.Length;
688 array = new DataColumn[num];
689 DataColumn[] array2 = new DataColumn[num];
690 for (int k = 0; k < num; k++)
691 {
692 if (foreignKeyConstraint._parentTableNamespace == null)
693 {
694 array[k] = _table.DataSet.Tables[foreignKeyConstraint._parentTableName].Columns[foreignKeyConstraint._parentColumnNames[k]];
695 }
696 else
697 {
698 array[k] = _table.DataSet.Tables[foreignKeyConstraint._parentTableName, foreignKeyConstraint._parentTableNamespace].Columns[foreignKeyConstraint._parentColumnNames[k]];
699 }
700 array2[k] = _table.Columns[foreignKeyConstraint._childColumnNames[k]];
701 }
702 ForeignKeyConstraint foreignKeyConstraint2 = new ForeignKeyConstraint(foreignKeyConstraint._constraintName, array, array2);
703 foreignKeyConstraint2.AcceptRejectRule = foreignKeyConstraint._acceptRejectRule;
704 foreignKeyConstraint2.DeleteRule = foreignKeyConstraint._deleteRule;
705 foreignKeyConstraint2.UpdateRule = foreignKeyConstraint._updateRule;
706 Add(foreignKeyConstraint2);
707 }
709 {
711 }
712 }
713}
virtual void Remove(object? obj)
virtual int Add(object? value)
virtual void CopyTo(Array array)
static bool IsCatchableOrSecurityExceptionType(Exception e)
Definition ADP.cs:800
static bool CompareArrays(DataColumn[] a1, DataColumn[] a2)
void ArrayRemove(Constraint constraint)
UniqueConstraint FindKeyConstraint(DataColumn[] columns)
bool CanRemove(Constraint constraint, bool fThrowException)
ForeignKeyConstraint FindForeignKeyConstraint(DataColumn[] parentColumns, DataColumn[] childColumns)
int InternalIndexOf(string constraintName)
bool Contains(string name, bool caseSensitive)
void AddRange(Constraint[]? constraints)
void BaseAdd(Constraint constraint)
void Add(Constraint constraint, bool addUniqueWhenAddingForeign)
int IndexOf(Constraint? constraint)
void BaseRemove(Constraint constraint)
Constraint Add(string? name, DataColumn primaryKeyColumn, DataColumn foreignKeyColumn)
CollectionChangeEventHandler? CollectionChanged
bool CanRemove(Constraint constraint)
CollectionChangeEventHandler _onCollectionChanged
void AddUniqueConstraint(UniqueConstraint constraint)
Constraint Add(string? name, DataColumn column, bool primaryKey)
bool AutoGenerated(Constraint constraint)
void AddForeignKeyConstraint(ForeignKeyConstraint constraint)
void OnCollectionChanged(CollectionChangeEventArgs ccevent)
void CopyTo(Constraint[] array, int index)
Constraint Add(string? name, DataColumn[] primaryKeyColumns, DataColumn[] foreignKeyColumns)
int IndexOf(string? constraintName)
void Remove(Constraint constraint)
void Add(Constraint constraint)
UniqueConstraint FindKeyConstraint(DataColumn column)
Constraint Add(string? name, DataColumn[] columns, bool primaryKey)
void BaseGroupSwitch(Constraint[] oldArray, int oldLength, Constraint[] newArray, int newLength)
void ArrayAdd(Constraint constraint)
Constraint FindConstraint(Constraint constraint)
bool CanBeRemovedFromCollection(ConstraintCollection constraint, bool fThrowException)
virtual string ConstraintName
Definition Constraint.cs:24
void SetChildKeyConstraint(ForeignKeyConstraint value)
void SetParentKeyConstraint(UniqueConstraint value)
virtual ? UniqueConstraint ParentKeyConstraint
virtual ? ForeignKeyConstraint ChildKeyConstraint
DataTableCollection Tables
Definition DataSet.cs:396
UniqueConstraint _primaryKey
Definition DataTable.cs:124
ConstraintCollection Constraints
Definition DataTable.cs:332
DataColumnCollection Columns
Definition DataTable.cs:327
DataRelationCollection ParentRelations
Definition DataTable.cs:572
DataRelation[] NestedParentRelations
Definition DataTable.cs:586
DataRelationCollection ChildRelations
Definition DataTable.cs:324
static Exception AddPrimaryKeyConstraint()
static Exception CaseInsensitiveNameConflict(string name)
static Exception ConstraintRemoveFailed()
static Exception ConstraintNotInTheTable(string constraint)
static Exception DuplicateConstraintName(string constraint)
static Exception ArgumentOutOfRange(string paramName)
static Exception DuplicateConstraint(string constraint)
static Exception InvalidOffsetLength()
static Exception CantAddConstraintToMultipleNestedTable(string tableName)
static Exception ConstraintParentValues()
static Exception ConstraintOutOfRange(int index)
static Exception UniqueConstraintViolation()
static Exception ConstraintForeignTable()
static Exception ArgumentNull(string paramName)
override void CheckCanAddToCollection(ConstraintCollection constraints)
static readonly CollectionChangeEventArgs s_refreshEventArgs
int NamesEqual(string s1, string s2, bool fCaseSensitive, CultureInfo locale)
static bool AutoGenerated(DataColumn col)
static ? Delegate Remove(Delegate? source, Delegate? value)
Definition Delegate.cs:463
static ? Delegate Combine(Delegate? a, Delegate? b)
Definition Delegate.cs:379
static CultureInfo InvariantCulture
delegate void CollectionChangeEventHandler(object? sender, CollectionChangeEventArgs e)