예제 #1
0
        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));
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }