Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Merger.cs
Go to the documentation of this file.
4
5namespace System.Data;
6
7internal sealed class Merger
8{
9 private readonly DataSet _dataSet;
10
11 private readonly DataTable _dataTable;
12
13 private readonly bool _preserveChanges;
14
16
17 private readonly bool _isStandAlonetable;
18
20
27
35
37 {
38 if (source == _dataSet)
39 {
40 return;
41 }
43 _dataSet.EnforceConstraints = false;
44 _IgnoreNSforTableLookup = _dataSet._namespaceURI != source._namespaceURI;
47 {
48 list = new List<DataColumn>();
49 foreach (DataTable table in _dataSet.Tables)
50 {
51 foreach (DataColumn column in table.Columns)
52 {
53 list.Add(column);
54 }
55 }
56 }
57 for (int i = 0; i < source.Tables.Count; i++)
58 {
59 MergeTableData(source.Tables[i]);
60 }
62 {
64 for (int j = 0; j < source.Relations.Count; j++)
65 {
66 MergeRelation(source.Relations[j]);
67 }
68 }
70 {
71 foreach (DataTable table2 in source.Tables)
72 {
74 foreach (DataColumn column2 in table2.Columns)
75 {
76 if (column2.Computed)
77 {
78 DataColumn dataColumn2 = dataTable3.Columns[column2.ColumnName];
79 if (!list.Contains(dataColumn2))
80 {
81 dataColumn2.CopyExpressionFrom(column2);
82 }
83 }
84 }
85 }
86 }
88 foreach (DataTable table3 in _dataSet.Tables)
89 {
90 table3.EvaluateExpressions();
91 }
92 _dataSet.EnforceConstraints = enforceConstraints;
93 }
94
95 internal void MergeTable(DataTable src)
96 {
97 bool enforceConstraints = false;
99 {
100 if (src.DataSet == _dataSet)
101 {
102 return;
103 }
105 _dataSet.EnforceConstraints = false;
106 }
107 else
108 {
109 if (src == _dataTable)
110 {
111 return;
112 }
113 _dataTable.SuspendEnforceConstraints = true;
114 }
115 if (_dataSet != null)
116 {
117 if (src.DataSet == null || src.DataSet._namespaceURI != _dataSet._namespaceURI)
118 {
120 }
121 }
122 else if (_dataTable.DataSet == null || src.DataSet == null || src.DataSet._namespaceURI != _dataTable.DataSet._namespaceURI)
123 {
125 }
128 if (dataTable == null && _dataSet != null)
129 {
130 dataTable = (_IgnoreNSforTableLookup ? _dataSet.Tables[src.TableName] : _dataSet.Tables[src.TableName, src.Namespace]);
131 }
132 dataTable?.EvaluateExpressions();
134 {
135 _dataSet.EnforceConstraints = enforceConstraints;
136 return;
137 }
138 _dataTable.SuspendEnforceConstraints = false;
139 try
140 {
142 {
144 }
145 }
146 catch (ConstraintException)
147 {
148 if (_dataTable.DataSet != null)
149 {
150 _dataTable.DataSet.EnforceConstraints = false;
151 }
152 throw;
153 }
154 }
155
157 {
158 int count = src.Rows.Count;
159 bool flag = dst.Rows.Count == 0;
160 if (0 < count)
161 {
162 Index index = null;
163 DataKey key = default(DataKey);
164 dst.SuspendIndexEvents();
165 try
166 {
167 if (!flag && dst._primaryKey != null)
168 {
169 key = GetSrcKey(src, dst);
170 if (key.HasValue)
171 {
172 index = dst._primaryKey.Key.GetSortIndex(DataViewRowState.OriginalRows | DataViewRowState.Added);
173 }
174 }
175 foreach (DataRow row in src.Rows)
176 {
177 DataRow targetRow = null;
178 if (index != null)
179 {
180 targetRow = dst.FindMergeTarget(row, key, index);
181 }
183 }
184 }
185 finally
186 {
187 dst.RestoreIndexEvents(forceReset: true);
188 }
189 }
190 MergeExtendedProperties(src.ExtendedProperties, dst.ExtendedProperties);
191 }
192
193 internal void MergeRows(DataRow[] rows)
194 {
195 DataTable dataTable = null;
196 DataTable dataTable2 = null;
197 DataKey key = default(DataKey);
198 Index index = null;
200 _dataSet.EnforceConstraints = false;
201 for (int i = 0; i < rows.Length; i++)
202 {
203 DataRow dataRow = rows[i];
204 if (dataRow == null)
205 {
206 throw ExceptionBuilder.ArgumentNull($"{"rows"}[{i}]");
207 }
208 if (dataRow.Table == null)
209 {
210 throw ExceptionBuilder.ArgumentNull($"{"rows"}[{i}].{"Table"}");
211 }
212 if (dataRow.Table.DataSet == _dataSet)
213 {
214 continue;
215 }
216 if (dataTable != dataRow.Table)
217 {
218 dataTable = dataRow.Table;
220 if (dataTable2 == null)
221 {
222 _dataSet.EnforceConstraints = enforceConstraints;
223 return;
224 }
225 if (dataTable2._primaryKey != null)
226 {
228 }
229 if (key.HasValue)
230 {
231 if (index != null)
232 {
233 index.RemoveRef();
234 index = null;
235 }
236 index = new Index(dataTable2, dataTable2._primaryKey.Key.GetIndexDesc(), DataViewRowState.OriginalRows | DataViewRowState.Added, null);
237 index.AddRef();
238 index.AddRef();
239 }
240 }
241 if (dataRow._newRecord != -1 || dataRow._oldRecord != -1)
242 {
243 DataRow targetRow = null;
244 if (0 < dataTable2.Rows.Count && index != null)
245 {
246 targetRow = dataTable2.FindMergeTarget(dataRow, key, index);
247 }
249 if (targetRow.Table._dependentColumns != null && targetRow.Table._dependentColumns.Count > 0)
250 {
251 targetRow.Table.EvaluateExpressions(targetRow, DataRowAction.Change, null);
252 }
253 }
254 }
255 if (index != null)
256 {
257 index.RemoveRef();
258 index = null;
259 }
260 _dataSet.EnforceConstraints = enforceConstraints;
261 }
262
264 {
265 DataTable dataTable = null;
267 {
269 {
271 }
272 }
273 else
274 {
276 }
277 if (dataTable == null)
278 {
280 {
281 dataTable = table.Clone(table.DataSet);
283 }
285 {
287 }
288 }
289 else
290 {
292 {
293 int count = dataTable.Columns.Count;
294 for (int i = 0; i < table.Columns.Count; i++)
295 {
296 DataColumn dataColumn = table.Columns[i];
297 DataColumn dataColumn2 = (dataTable.Columns.Contains(dataColumn.ColumnName, caseSensitive: true) ? dataTable.Columns[dataColumn.ColumnName] : null);
298 if (dataColumn2 == null)
299 {
301 {
302 dataColumn2 = dataColumn.Clone();
303 dataTable.Columns.Add(dataColumn2);
304 continue;
305 }
307 {
309 continue;
310 }
312 }
313 if (dataColumn2.DataType != dataColumn.DataType || (dataColumn2.DataType == typeof(DateTime) && dataColumn2.DateTimeMode != dataColumn.DateTimeMode && (dataColumn2.DateTimeMode & dataColumn.DateTimeMode) != DataSetDateTime.Unspecified))
314 {
316 {
318 }
320 }
321 MergeExtendedProperties(dataColumn.ExtendedProperties, dataColumn2.ExtendedProperties);
322 }
324 {
325 for (int j = count; j < dataTable.Columns.Count; j++)
326 {
327 dataTable.Columns[j].CopyExpressionFrom(table.Columns[dataTable.Columns[j].ColumnName]);
328 }
329 }
330 DataColumn[] primaryKey = dataTable.PrimaryKey;
332 if (primaryKey.Length != primaryKey2.Length)
333 {
334 if (primaryKey.Length == 0)
335 {
336 DataColumn[] array = new DataColumn[primaryKey2.Length];
337 for (int k = 0; k < primaryKey2.Length; k++)
338 {
339 array[k] = dataTable.Columns[primaryKey2[k].ColumnName];
340 }
341 dataTable.PrimaryKey = array;
342 }
343 else if (primaryKey2.Length != 0)
344 {
346 }
347 }
348 else
349 {
350 for (int l = 0; l < primaryKey.Length; l++)
351 {
352 if (string.Compare(primaryKey[l].ColumnName, primaryKey2[l].ColumnName, ignoreCase: false, dataTable.Locale) != 0)
353 {
355 }
356 }
357 }
358 }
359 MergeExtendedProperties(table.ExtendedProperties, dataTable.ExtendedProperties);
360 }
361 return dataTable;
362 }
363
365 {
367 if (dataTable == null)
368 {
369 return;
370 }
371 dataTable.MergingData = true;
372 try
373 {
375 }
376 finally
377 {
378 dataTable.MergingData = false;
379 }
380 }
381
383 {
384 for (int i = 0; i < source.Tables.Count; i++)
385 {
386 MergeConstraints(source.Tables[i]);
387 }
388 }
389
390 private void MergeConstraints(DataTable table)
391 {
392 for (int i = 0; i < table.Constraints.Count; i++)
393 {
394 Constraint constraint = table.Constraints[i];
396 if (constraint2 == null)
397 {
399 continue;
400 }
401 Constraint constraint3 = constraint2.Table.Constraints.FindConstraint(constraint2);
402 if (constraint3 == null)
403 {
405 {
406 try
407 {
408 constraint2.Table.Constraints.Add(constraint2);
409 }
411 {
412 constraint2.ConstraintName = string.Empty;
413 constraint2.Table.Constraints.Add(constraint2);
414 }
415 }
417 {
419 }
420 }
421 else
422 {
423 MergeExtendedProperties(constraint.ExtendedProperties, constraint3.ExtendedProperties);
424 }
425 }
426 }
427
429 {
431 int num = _dataSet.Relations.InternalIndexOf(relation.RelationName);
432 if (num >= 0)
433 {
435 if (relation.ParentKey.ColumnsReference.Length != dataRelation.ParentKey.ColumnsReference.Length)
436 {
438 }
439 for (int i = 0; i < relation.ParentKey.ColumnsReference.Length; i++)
440 {
441 DataColumn dataColumn = dataRelation.ParentKey.ColumnsReference[i];
442 DataColumn dataColumn2 = relation.ParentKey.ColumnsReference[i];
443 if (string.Compare(dataColumn.ColumnName, dataColumn2.ColumnName, ignoreCase: false, dataColumn.Table.Locale) != 0)
444 {
446 }
447 dataColumn = dataRelation.ChildKey.ColumnsReference[i];
448 dataColumn2 = relation.ChildKey.ColumnsReference[i];
449 if (string.Compare(dataColumn.ColumnName, dataColumn2.ColumnName, ignoreCase: false, dataColumn.Table.Locale) != 0)
450 {
452 }
453 }
454 }
455 else
456 {
458 {
460 }
461 DataTable dataTable = (_IgnoreNSforTableLookup ? _dataSet.Tables[relation.ParentTable.TableName] : _dataSet.Tables[relation.ParentTable.TableName, relation.ParentTable.Namespace]);
462 DataTable dataTable2 = (_IgnoreNSforTableLookup ? _dataSet.Tables[relation.ChildTable.TableName] : _dataSet.Tables[relation.ChildTable.TableName, relation.ChildTable.Namespace]);
463 DataColumn[] array = new DataColumn[relation.ParentKey.ColumnsReference.Length];
464 DataColumn[] array2 = new DataColumn[relation.ParentKey.ColumnsReference.Length];
465 for (int j = 0; j < relation.ParentKey.ColumnsReference.Length; j++)
466 {
467 array[j] = dataTable.Columns[relation.ParentKey.ColumnsReference[j].ColumnName];
468 array2[j] = dataTable2.Columns[relation.ChildKey.ColumnsReference[j].ColumnName];
469 }
470 try
471 {
472 dataRelation = new DataRelation(relation.RelationName, array, array2, relation._createConstraints);
473 dataRelation.Nested = relation.Nested;
475 }
477 {
480 }
481 }
482 MergeExtendedProperties(relation.ExtendedProperties, dataRelation.ExtendedProperties);
483 }
484
486 {
488 {
489 return;
490 }
492 while (enumerator.MoveNext())
493 {
494 if (!_preserveChanges || dst[enumerator.Key] == null)
495 {
496 dst[enumerator.Key] = enumerator.Value;
497 }
498 }
499 }
500
502 {
503 if (src._primaryKey != null)
504 {
505 return src._primaryKey.Key;
506 }
507 DataKey result = default(DataKey);
508 if (dst._primaryKey != null)
509 {
510 DataColumn[] columnsReference = dst._primaryKey.Key.ColumnsReference;
512 for (int i = 0; i < columnsReference.Length; i++)
513 {
514 array[i] = src.Columns[columnsReference[i].ColumnName];
515 }
516 result = new DataKey(array, copyColumns: false);
517 }
518 return result;
519 }
520}
bool ICollection< KeyValuePair< TKey, TValue > >. Contains(KeyValuePair< TKey, TValue > keyValuePair)
void Add(TKey key, TValue value)
static bool IsCatchableExceptionType(Exception e)
Definition ADP.cs:790
PropertyCollection ExtendedProperties
Definition Constraint.cs:95
virtual string ConstraintName
Definition Constraint.cs:24
Constraint Clone(DataSet destination)
DataRelationCollection Relations
Definition DataSet.cs:393
DataTableCollection Tables
Definition DataSet.cs:396
string _namespaceURI
Definition DataSet.cs:67
PropertyCollection ExtendedProperties
Definition DataSet.cs:315
void RaiseMergeFailed(DataTable table, string conflict, MissingSchemaAction missingSchemaAction)
Definition DataSet.cs:2593
ConstraintCollection Constraints
Definition DataTable.cs:332
PropertyCollection ExtendedProperties
Definition DataTable.cs:432
DataColumnCollection Columns
Definition DataTable.cs:327
DataColumn[] PrimaryKey
Definition DataTable.cs:607
virtual DataTable Clone()
static Exception MergeFailed(string name)
static Exception TraceExceptionForCapture(Exception e)
static Exception MergeMissingDefinition(string obj)
static Exception ArgumentNull(string paramName)
readonly MissingSchemaAction _missingSchemaAction
Definition Merger.cs:15
DataTable MergeSchema(DataTable table)
Definition Merger.cs:263
void MergeTable(DataTable src)
Definition Merger.cs:95
void MergeTableData(DataTable src)
Definition Merger.cs:364
DataKey GetSrcKey(DataTable src, DataTable dst)
Definition Merger.cs:501
void MergeRows(DataRow[] rows)
Definition Merger.cs:193
void MergeDataSet(DataSet source)
Definition Merger.cs:36
readonly bool _preserveChanges
Definition Merger.cs:13
void MergeConstraints(DataTable table)
Definition Merger.cs:390
void MergeExtendedProperties(PropertyCollection src, PropertyCollection dst)
Definition Merger.cs:485
Merger(DataTable dataTable, bool preserveChanges, MissingSchemaAction missingSchemaAction)
Definition Merger.cs:28
Merger(DataSet dataSet, bool preserveChanges, MissingSchemaAction missingSchemaAction)
Definition Merger.cs:21
void MergeConstraints(DataSet source)
Definition Merger.cs:382
void MergeTable(DataTable src, DataTable dst)
Definition Merger.cs:156
bool _IgnoreNSforTableLookup
Definition Merger.cs:19
readonly DataSet _dataSet
Definition Merger.cs:9
void MergeRelation(DataRelation relation)
Definition Merger.cs:428
readonly bool _isStandAlonetable
Definition Merger.cs:17
readonly DataTable _dataTable
Definition Merger.cs:11
static string DataMerge_MissingConstraint
Definition SR.cs:562
static string DataMerge_PrimaryKeyColumnsMismatch
Definition SR.cs:568
static string DataMerge_MissingDefinition
Definition SR.cs:560
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string DataMerge_DataTypeMismatch
Definition SR.cs:564
static string DataMerge_ReltionKeyColumnsMismatch
Definition SR.cs:570
static string DataMerge_MissingColumnDefinition
Definition SR.cs:572
static string DataMerge_PrimaryKeyMismatch
Definition SR.cs:566
Definition SR.cs:7