Exemple #1
0
        private void ExtractForeignKeys(Schema schema)
        {
            // PRAGMA foreign_key_list - retuns column list for all foreign key
            // row structure:
            // 0 - id (numeric value, identifier, unique across foreign keys but non-unique across results)
            // 1 - seq (numeric value, describes order within foreign key)
            // 2 - table (string value, foreign table name)
            // 3 - from (string value, local column name)
            // 4 - to (string value, referenced column)
            // 5 - on_update (string value, action on update)
            // 6 - on_delete (string value, action on delete)
            // 7 - match (string value, always NONE)

            foreach (var table in schema.Tables)
            {
                var query = BuildExtractForeignKeysQuery(table.Name);

                var state = new ForeignKeyReaderState(table);
                using var cmd    = Connection.CreateCommand(query);
                using var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ReadForeignKeyColumnData(reader, table, ref state);
                }
            }
        }
Exemple #2
0
        private void ExtractForeignKeys(ExtractionContext context)
        {
            using var reader = ExecuteReader(context.PerformReplacements(GetExtractForeignKeysQuery()));
            var state = new ForeignKeyReaderState(context.Catalog);

            while (reader.Read())
            {
                ReadForeignKeyColumnData(reader, ref state);
            }
        }
        private void ExtractForeignKeys(Catalog catalog)
        {
            using var command = Connection.CreateCommand(GetExtractForeignKeysQuery());
            using var reader  = command.ExecuteReader(CommandBehavior.SingleResult);
            var readerState = new ForeignKeyReaderState(catalog.DefaultSchema, catalog.DefaultSchema);

            while (reader.Read())
            {
                ReadForeignKeyColumnData(reader, ref readerState);
            }
        }
Exemple #4
0
        private void ExtractForeignKeys(ExtractionContext context)
        {
            var query = context.PerformReplacements(GetExtractForeignKeysQuery());

            using var command = Connection.CreateCommand(query);
            using var reader  = command.ExecuteReader();
            var state = new ForeignKeyReaderState(context.Catalog);

            while (reader.Read())
            {
                ReadForeignKeyColumnData(reader, ref state);
            }
        }
Exemple #5
0
        private async Task ExtractForeignKeysAsync(ExtractionContext context, CancellationToken token)
        {
            var query  = context.PerformReplacements(GetExtractForeignKeysQuery());
            var reader = await ExecuteReaderAsync(query, token).ConfigureAwait(false);

            await using (reader.ConfigureAwait(false)) {
                var state = new ForeignKeyReaderState(context.Catalog);
                while (await reader.ReadAsync(token).ConfigureAwait(false))
                {
                    ReadForeignKeyColumnData(reader, ref state);
                }
            }
        }
Exemple #6
0
        private void ExtractForeignKeys(Schema schema)
        {
            foreach (var table in schema.Tables)
            {
                var query = BuildExtractForeignKeysQuery(table.Name);

                var state = new ForeignKeyReaderState(table);
                using var cmd    = Connection.CreateCommand(query);
                using var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ReadForeignKeyColumnData(reader, table, ref state);
                }
            }
        }
        private async Task ExtractForeignKeysAsync(Catalog catalog, CancellationToken token)
        {
            var command = Connection.CreateCommand(GetExtractForeignKeysQuery());

            await using (command.ConfigureAwait(false)) {
                var reader = await command.ExecuteReaderAsync(CommandBehavior.SingleResult, token).ConfigureAwait(false);

                await using (reader.ConfigureAwait(false)) {
                    var readerState = new ForeignKeyReaderState(catalog.DefaultSchema, catalog.DefaultSchema);
                    while (await reader.ReadAsync(token).ConfigureAwait(false))
                    {
                        ReadForeignKeyColumnData(reader, ref readerState);
                    }
                }
            }
        }
Exemple #8
0
        private async Task ExtractForeignKeysAsync(Schema schema, CancellationToken token)
        {
            foreach (var table in schema.Tables)
            {
                var query = BuildExtractForeignKeysQuery(table.Name);

                var state = new ForeignKeyReaderState(table);
                var cmd   = Connection.CreateCommand(query);
                await using (cmd.ConfigureAwait(false)) {
                    var reader = await cmd.ExecuteReaderAsync(token).ConfigureAwait(false);

                    await using (reader.ConfigureAwait(false)) {
                        while (await reader.ReadAsync(token).ConfigureAwait(false))
                        {
                            ReadForeignKeyColumnData(reader, table, ref state);
                        }
                    }
                }
            }
        }
        private static void ReadForeignKeyColumnData(DbDataReader reader, ref ForeignKeyReaderState state)
        {
            int columnPosition = reader.GetInt16(7);

            if (columnPosition <= state.LastColumnIndex)
            {
                state.ReferencingTable = state.ReferencingSchema.Tables[reader.GetString(1).Trim()];
                state.ForeignKey       = state.ReferencingTable.CreateForeignKey(reader.GetString(2).Trim());
                ReadConstraintProperties(state.ForeignKey, reader, 3, 4);
                ReadCascadeAction(state.ForeignKey, reader, 5);
                state.ReferencedTable            = state.ReferencedSchema.Tables[reader.GetString(9).Trim()];
                state.ForeignKey.ReferencedTable = state.ReferencedTable;
            }

            var referencingColumn = state.ReferencingTable.TableColumns[reader.GetString(6).Trim()];
            var referencedColumn  = state.ReferencedTable.TableColumns[reader.GetString(10).Trim()];

            state.ForeignKey.Columns.Add(referencingColumn);
            state.ForeignKey.ReferencedColumns.Add(referencedColumn);
            state.LastColumnIndex = columnPosition;
        }
Exemple #10
0
        //----  ReadForeignKeyColumnData
        //  0       constraint_schema,
        //  1       table_name,
        //  2       constraint_name,
        //  3       delete_rule,
        //  4       column_name,
        //  5       ordinal_position,
        //  6       referenced_table_schema,
        //  7       referenced_table_name,
        //  8       referenced_column_name
        private static void ReadForeignKeyColumnData(DbDataReader reader, ref ForeignKeyReaderState state)
        {
            var columnIndex = ReadInt(reader, 5);

            if (columnIndex <= state.LastColumnIndex)
            {
                var referencingSchema = state.Catalog.Schemas[reader.GetString(0)];
                state.ReferencingTable = referencingSchema.Tables[reader.GetString(1)];
                state.ForeignKey       = state.ReferencingTable.CreateForeignKey(reader.GetString(2));
                ReadCascadeAction(state.ForeignKey, reader, 3);
                var referencedSchema = state.Catalog.Schemas[reader.GetString(0)]; //Schema same as current
                state.ReferencedTable            = referencedSchema.Tables[reader.GetString(7)];
                state.ForeignKey.ReferencedTable = state.ReferencedTable;
            }

            var referencingColumn = state.ReferencingTable.TableColumns[reader.GetString(4)];
            var referencedColumn  = state.ReferencedTable.TableColumns[reader.GetString(8)];

            state.ForeignKey.Columns.Add(referencingColumn);
            state.ForeignKey.ReferencedColumns.Add(referencedColumn);
            state.LastColumnIndex = columnIndex;
        }
Exemple #11
0
        private static void ReadForeignKeyColumnData(DbDataReader reader, ref ForeignKeyReaderState state)
        {
            var lastColumnIndex = ReadInt(reader, 7);

            if (lastColumnIndex <= state.LastColumnIndex)
            {
                var referencingSchema = state.Catalog.Schemas[reader.GetString(0)];
                state.ReferencingTable = referencingSchema.Tables[reader.GetString(1)];
                state.ForeignKey       = state.ReferencingTable.CreateForeignKey(reader.GetString(2));
                ReadConstraintProperties(state.ForeignKey, reader, 3, 4);
                ReadCascadeAction(state.ForeignKey, reader, 5);
                var referencedSchema = state.Catalog.Schemas[reader.GetString(8)];
                state.ReferencedTable            = referencedSchema.Tables[reader.GetString(9)];
                state.ForeignKey.ReferencedTable = state.ReferencedTable;
            }

            var referencingColumn = state.ReferencingTable.TableColumns[reader.GetString(6)];
            var referencedColumn  = state.ReferencedTable.TableColumns[reader.GetString(10)];

            state.ForeignKey.Columns.Add(referencingColumn);
            state.ForeignKey.ReferencedColumns.Add(referencedColumn);
            state.LastColumnIndex = lastColumnIndex;
        }
Exemple #12
0
        private static void ReadForeignKeyColumnData(DbDataReader reader, Table table, ref ForeignKeyReaderState state)
        {
            var columnIndex = ReadInt(reader, 1);

            if (columnIndex <= state.LastColumnIndex)
            {
                var foreignKeyName = string.Format(
                    CultureInfo.InvariantCulture, "FK_{0}_{1}", state.ReferencingTable.Name, ReadStringOrNull(reader, 2));

                state.ForeignKey = state.ReferencingTable.CreateForeignKey(foreignKeyName);

                ReadCascadeAction(state.ForeignKey, reader, 6);
                var referencedSchema = table.Schema; //Schema same as current
                var referencedTable  = referencedSchema.Tables[ReadStringOrNull(reader, 2)];
                state.ReferencedTable            = referencedTable;
                state.ForeignKey.ReferencedTable = referencedTable;
            }

            var referencingColumn = state.ReferencingTable.TableColumns[reader.GetString(3)];
            var referencedColumn  = state.ReferencedTable.TableColumns[reader.GetString(4)];

            state.ForeignKey.Columns.Add(referencingColumn);
            state.ForeignKey.ReferencedColumns.Add(referencedColumn);
            state.LastColumnIndex = columnIndex;
        }