private static void ReadIndexColumnData(DbDataReader reader, ref IndexReaderState state) { SqlExpression expression = null; state.IndexName = reader.GetString(2).Trim(); if (state.IndexName != state.LastIndexName) { state.Table = state.Schema.Tables[reader.GetString(1).Trim()]; state.Index = state.Table.CreateIndex(state.IndexName); state.Index.IsUnique = ReadBool(reader, 5); state.Index.IsBitmap = false; state.Index.IsClustered = false; if (!reader.IsDBNull(8)) { // expression index expression = SqlDml.Native(reader.GetString(8).Trim()); } } if (expression == null) { var column = state.Table.TableColumns[reader.GetString(6).Trim()]; var isDescending = ReadBool(reader, 4); _ = state.Index.CreateIndexColumn(column, !isDescending); } else { var isDescending = ReadBool(reader, 4); _ = state.Index.CreateIndexColumn(expression, !isDescending); } state.LastIndexName = state.IndexName; }
private void ExtractIndexes(Catalog catalog) { using var command = Connection.CreateCommand(GetExtractIndexesQuery()); using var reader = command.ExecuteReader(CommandBehavior.SingleResult); var readerState = new IndexReaderState(catalog.DefaultSchema); while (reader.Read()) { ReadIndexColumnData(reader, ref readerState); } }
private async Task ExtractIndexesAsync(Catalog catalog, CancellationToken token) { var command = Connection.CreateCommand(GetExtractIndexesQuery()); await using (command.ConfigureAwait(false)) { var reader = await command.ExecuteReaderAsync(CommandBehavior.SingleResult, token).ConfigureAwait(false); await using (reader.ConfigureAwait(false)) { var readerState = new IndexReaderState(catalog.DefaultSchema); while (await reader.ReadAsync(token).ConfigureAwait(false)) { ReadIndexColumnData(reader, ref readerState); } } } }