private void ExtractUniqueAndPrimaryKeyConstraints(Catalog catalog) { using var command = Connection.CreateCommand(GetExtractUniqueAndPrimaryKeyConstraintsQuery()); using var reader = command.ExecuteReader(CommandBehavior.SingleResult); var readerState = new PrimaryKeyReaderState(catalog.DefaultSchema); bool readingCompleted; do { readingCompleted = !reader.Read(); ReadPrimaryKeyColumn(reader, readingCompleted, ref readerState); } while (!readingCompleted); }
private async Task ExtractUniqueAndPrimaryKeyConstraintsAsync(Catalog catalog, CancellationToken token) { var command = Connection.CreateCommand(GetExtractUniqueAndPrimaryKeyConstraintsQuery()); await using (command.ConfigureAwait(false)) { var reader = await command.ExecuteReaderAsync(CommandBehavior.SingleResult, token).ConfigureAwait(false); await using (reader.ConfigureAwait(false)) { var readerState = new PrimaryKeyReaderState(catalog.DefaultSchema); bool readingCompleted; do { readingCompleted = !await reader.ReadAsync(token).ConfigureAwait(false); ReadPrimaryKeyColumn(reader, readingCompleted, ref readerState); } while (!readingCompleted); } } }
private static void ReadPrimaryKeyColumn(DbDataReader reader, bool readingCompleted, ref PrimaryKeyReaderState state) { if (readingCompleted) { if (state.Columns.Count > 0) { CreateIndexBasedConstraint(state.Table, state.ConstraintName, state.ConstraintType, state.Columns); } return; } int columnPosition = reader.GetInt16(5); if (columnPosition <= state.LastColumnIndex) { CreateIndexBasedConstraint(state.Table, state.ConstraintName, state.ConstraintType, state.Columns); state.Columns.Clear(); } if (state.Columns.Count == 0) { state.Table = state.Schema.Tables[reader.GetString(1).Trim()]; state.ConstraintName = reader.GetString(2).Trim(); state.ConstraintType = reader.GetString(3).Trim(); } state.Columns.Add(state.Table.TableColumns[reader.GetString(4).Trim()]); state.LastColumnIndex = columnPosition; }