private static IEnumerable <IRow> GetReferencingRows( [NotNull] ReferencedTableInfo referencedTableInfo, [NotNull] ReferencingTableInfo referencingTableInfo) { const bool recycle = true; const int maxKeyCount = 20; if (referencedTableInfo.KeySet.Count <= maxKeyCount) { return(GdbQueryUtils.GetRowsInList( referencingTableInfo.Table, referencingTableInfo.ForeignKeyFieldName, referencedTableInfo.KeySet, recycle, referencingTableInfo.Filter)); } var queryFilter = new QueryFilterClass { WhereClause = string.Format("{0} IS NOT NULL", referencingTableInfo.ForeignKeyFieldName) }; return(GdbQueryUtils.GetRows(referencingTableInfo.Table, queryFilter, recycle)); }
private int RemoveExist( [NotNull] ReferencedTableInfo referencedTableInfo, [NotNull] IEnumerable <ReferencingTableInfo> referencingTableInfos) { foreach (ReferencingTableInfo referencingTableInfo in referencingTableInfos) { foreach (IRow row in GetReferencingRows(referencedTableInfo, referencingTableInfo)) { object foreignKey = referencingTableInfo.GetForeignKey(row); string errorDescription; object convertedValue; if (!TryConvertForeignKey(referencingTableInfo, foreignKey, referencedTableInfo, out errorDescription, out convertedValue)) { return(ReportError(errorDescription, TestUtils.GetShapeCopy(row), Codes[Code.ConversionError], null, row)); } referencedTableInfo.RemoveObject(convertedValue); } } return(NoError); }
private bool TryConvertForeignKey( [NotNull] ReferencingTableInfo referencingTableInfo, [NotNull] object foreignKey, [NotNull] ReferencedTableInfo referencedTableInfo, [NotNull] out string errorDescription, [CanBeNull] out object convertedValue) { try { convertedValue = FieldUtils.ConvertAttributeValue( foreignKey, referencingTableInfo.ForeignKeyFieldType, referencedTableInfo.KeyFieldType); errorDescription = string.Empty; return(true); } catch (Exception e) { errorDescription = FieldValueUtils.GetTypeConversionErrorDescription( _referencedTable, foreignKey, referencingTableInfo.ForeignKeyFieldName, referencedTableInfo.KeyFieldName, e.Message); convertedValue = null; return(false); } }
private void EnsureReferenceInfos() { if (_referencingTableInfos != null) { return; } _referencedTableInfo = new ReferencedTableInfo(_referencedTable, _referencedTableKey); _referencingTableInfos = new List <ReferencingTableInfo>(); for (var i = 0; i < _referencingTables.Count; i++) { ITable referencingTable = _referencingTables[i]; int referencingTableIndex = i + 1; // first index is referenced table string whereClause = GetConstraint(referencingTableIndex); string relation = _relations[i]; var referencingTableInfo = new ReferencingTableInfo( referencingTable, relation, whereClause); bool supported = KeySetUtils.IsSupportedTypeCombination( _referencedTableInfo.KeyFieldType, referencingTableInfo.ForeignKeyFieldType); Assert.ArgumentCondition( supported, "key fields have unsupported combination of types: " + "referencing table = {0}, foreign key = {1}, referenced key = {2}", ((IDataset)referencingTableInfo.Table).Name, referencingTableInfo.ForeignKeyFieldType, _referencedTableInfo.KeyFieldType); _referencingTableInfos.Add(referencingTableInfo); } _referencedTableFilter = new QueryFilterClass { WhereClause = GetConstraint(0) }; GdbQueryUtils.SetSubFields(_referencedTableFilter, _referencedTableInfo.KeyFieldName, _referencedTable.OIDFieldName); }
private int VerifyRowsExist( [NotNull] ReferencedTableInfo referencedTableInfo, [NotNull] IEnumerable <ReferencingTableInfo> referencingTableInfos) { int errorCount = RemoveExist(referencedTableInfo, referencingTableInfos); if (referencedTableInfo.KeySet.Count == 0) { return(errorCount); } const bool recycle = true; foreach (IRow row in GdbQueryUtils.GetRowsInList(referencedTableInfo.Table, referencedTableInfo .KeyFieldName, referencedTableInfo.KeySet, recycle, _referencedTableFilter)) { if (CancelTestingRow(row, recycleUnique: Guid.NewGuid())) { continue; } object key = row.Value[referencedTableInfo.KeyFieldIndex]; string description = string.Format( "Value [{0}] is not referenced by any table", key); string fieldName; TestUtils.GetFieldDisplayName(row, referencedTableInfo.KeyFieldIndex, out fieldName); errorCount += ReportError(description, TestUtils.GetShapeCopy(row), Codes[Code.ValueNotReferenced], fieldName, row); } referencedTableInfo.KeySet.Clear(); return(errorCount); }