Ejemplo n.º 1
0
 public DBTableSchema()
 {
     Columns           = new DBColumnSchema[0];
     ForeignKeys       = new DBForeignKeySchema[0];
     UniqueConstraints = new DBUniqueConstraintSchema[0];
     PrimaryKeyColumns = new DBColumnSchema[0];
     BlobColumns       = new DBColumnSchema[0];
 }
Ejemplo n.º 2
0
        private DBKeyRoot FindKeyRootRecursively(DBTableSchema table, DBColumnSchema keyColumn)
        {
            if (!(keyColumn.IsPrimaryKey || keyColumn.IsForeignKey || keyColumn.IsUnique))
            {
                throw new ArgumentException("Column is not a key", "keyColumn");
            }

            if ((keyColumn.IsPrimaryKey || keyColumn.IsUnique) && !keyColumn.IsForeignKey)
            {
                return new DBKeyRoot {
                           RootColumn      = keyColumn.Name,
                           RootTable       = table.Name,
                           IsAutoIncrement = keyColumn.IsAutoIncrement,
                           UsesSequence    = keyColumn.UsesSequence
                }
            }
            ;

            Debug.Assert(keyColumn.IsForeignKey);

            // Since this is not a root primary key, recursively call the linked to primary key
            foreach (var foreignKey in table.ForeignKeys)
            {
                for (int i = 0; i < foreignKey.ForeignKeyColumns.Length; i++)
                {
                    if (foreignKey.ForeignKeyColumns[i] == keyColumn.Name)
                    {
                        var tableName  = foreignKey.ReferenceTable;
                        var columnName = foreignKey.ReferenceColumns[i];
                        var pkTable    = this[tableName];
                        var pkColumn   = pkTable.GetColumn(columnName);

                        // If it's a foreign key to itself (stupid but possible), then it is the root
                        if (table.Name == pkTable.Name && keyColumn.Name == pkColumn.Name)
                        {
                            return new DBKeyRoot {
                                       RootColumn      = keyColumn.Name,
                                       RootTable       = table.Name,
                                       IsAutoIncrement = keyColumn.IsAutoIncrement,
                                       UsesSequence    = keyColumn.UsesSequence
                            }
                        }
                        ;

                        return(FindKeyRootRecursively(pkTable, pkColumn));
                    }
                }
            }
            throw new Exception(string.Format("Unable to find key root for {0}.{1}", table.Name, keyColumn.Name));
        }
Ejemplo n.º 3
0
        public IEnumerable <Tuple <DBColumnSchema, DBColumnSchema> > GetColumnBindings(IEnumerable <DBColumnSchema> columns)
        {
            var bindings = new List <Tuple <DBColumnSchema, DBColumnSchema> >();

            foreach (var column in columns)
            {
                DBColumnSchema reference = null;
                var            foreignKeysInvolvingColumn = ForeignKeys.Where(fk => column.Name.IsIn(fk.ForeignKeyColumns));
                if (foreignKeysInvolvingColumn.Any())
                {
                    var foreignKey          = foreignKeysInvolvingColumn.Single();
                    int index               = foreignKey.ForeignKeyColumns.IndexOf(column.Name);
                    var referenceColumnName = foreignKey.ReferenceColumns[index];
                    var referenceTable      = this.Owner[foreignKey.ReferenceTable];
                    reference = referenceTable[referenceColumnName];
                }
                bindings.Add(Tuple.Create(column, reference));
            }
            return(bindings);
        }