private static void ReadIndexBasedConstraintData(DbDataReader reader, ref IndexBasedConstraintReaderState state, bool readingCompleted) { if (readingCompleted) { if (state.Columns.Count > 0) { CreateIndexBasedConstraint(ref state); } } else { var columnIndex = ReadInt(reader, 5); if (columnIndex <= state.LastColumnIndex) { CreateIndexBasedConstraint(ref state); state.Columns.Clear(); } if (state.Columns.Count == 0) { var schema = state.Catalog.Schemas[reader.GetString(0)]; state.Table = schema.Tables[reader.GetString(1)]; state.ConstraintName = reader.GetString(2); state.ConstraintType = reader.GetString(3); } state.Columns.Add(state.Table.TableColumns[reader.GetString(4)]); state.LastColumnIndex = columnIndex; } }
private void ExtractUniqueAndPrimaryKeyConstraints(ExtractionContext context) { var query = context.PerformReplacements(GetExtractUniqueAndPrimaryKeyConstraintsQuery()); using var reader = ExecuteReader(query); var state = new IndexBasedConstraintReaderState(context.Catalog); bool readingCompleted; do { readingCompleted = !reader.Read(); ReadIndexBasedConstraintData(reader, ref state, readingCompleted); } while (!readingCompleted); }
private static void CreateIndexBasedConstraint(ref IndexBasedConstraintReaderState state) { switch (state.ConstraintType) { case "PRIMARY KEY": _ = state.Table.CreatePrimaryKey(state.ConstraintName, state.Columns.ToArray()); return; case "UNIQUE": _ = state.Table.CreateUniqueConstraint(state.ConstraintName, state.Columns.ToArray()); return; default: throw new ArgumentOutOfRangeException(nameof(IndexBasedConstraintReaderState.ConstraintType)); } }
private async Task ExtractUniqueAndPrimaryKeyConstraintsAsync(ExtractionContext context, CancellationToken token) { var query = context.PerformReplacements(GetExtractUniqueAndPrimaryKeyConstraintsQuery()); var reader = await ExecuteReaderAsync(query, token).ConfigureAwait(false); await using (reader.ConfigureAwait(false)) { var state = new IndexBasedConstraintReaderState(context.Catalog); bool readingCompleted; do { readingCompleted = !await reader.ReadAsync(token).ConfigureAwait(false); ReadIndexBasedConstraintData(reader, ref state, readingCompleted); } while (!readingCompleted); } }
//---- ReadIndexBasedConstraintData // 0 constraint_schema, // 1 table_name, // 2 constraint_name, // 3 constraint_type, // 4 column_name, // 5 ordinal_position private static void ReadIndexBasedConstraintData(DbDataReader reader, ref IndexBasedConstraintReaderState state, bool readingCompleted) { if (readingCompleted) { if (state.Columns.Count > 0) { CreateIndexBasedConstraint(ref state); } } else { var columnIndex = ReadInt(reader, 5); if (columnIndex <= state.LastColumnIndex) { CreateIndexBasedConstraint(ref state); state.Columns.Clear(); } if (state.Columns.Count == 0) { var schemaName = reader.GetString(0); var tableName = reader.GetString(1); var schema = state.Catalog.Schemas[schemaName]; if (schema == null) { throw new InvalidOperationException($"Schema '{schemaName}' is not found"); } state.Table = schema.Tables[tableName]; if (state.Table == null) { throw new InvalidOperationException($"Table '{tableName}' is not found in schema '{schemaName}'"); } state.ConstraintName = reader.GetString(2); state.ConstraintType = reader.GetString(3); } state.Columns.Add(state.Table.TableColumns[reader.GetString(4)]); state.LastColumnIndex = columnIndex; } }