//---- ReadIndexColumnData // 0 table_schema, // 1 table_name, // 2 index_name, // 3 non_unique, // 4 index_type, // 5 seq_in_index, // 6 column_name, // 7 cardinality, // 8 sub_part, // 9 nullable private static void ReadIndexColumnData(DbDataReader reader, ref IndexColumnReaderState state) { var columnIndex = ReadInt(reader, 5); if (columnIndex <= state.LastColumnIndex) { var schema = state.Catalog.Schemas[reader.GetString(0)]; state.Table = schema.Tables[reader.GetString(1)]; if (IsFullTextIndex(reader, 4)) { state.Table.CreateFullTextIndex(reader.GetString(2)); } else { state.Index = state.Table.CreateIndex(reader.GetString(2)); state.Index.IsUnique = reader.GetInt32(3) == 0; } } var column = state.Table.TableColumns[reader.GetString(6)]; state.Index.CreateIndexColumn(column); state.LastColumnIndex = columnIndex; }
private static void ReadIndexColumnData(OracleDataReader reader, ref IndexColumnReaderState state) { // it's possible to have table and index in different schemas in oracle. // we silently ignore this, indexes are always belong to the same schema as its table. var columnIndex = ReadInt(reader, 6); if (columnIndex <= state.LastColumnIndex) { var schema = state.Catalog.Schemas[reader.GetString(0)]; state.Table = schema.Tables[reader.GetString(1)]; state.Index = state.Table.CreateIndex(reader.GetString(2)); state.Index.IsUnique = ReadBool(reader, 3); state.Index.IsBitmap = reader.GetString(4).EndsWith("BITMAP"); if (!reader.IsDBNull(5)) { var pctFree = ReadInt(reader, 5); state.Index.FillFactor = (byte)(100 - pctFree); } } var columnName = reader.IsDBNull(9) ? reader.GetString(7) : reader.GetOracleString(9).Value; columnName = columnName.Trim('"'); var column = state.Table.TableColumns[columnName]; var isAscending = reader.GetString(8) == "ASC"; _ = state.Index.CreateIndexColumn(column, isAscending); state.LastColumnIndex = columnIndex; }
private void ExtractIndexes(ExtractionContext context) { var query = context.PerformReplacements(GetExtractIndexesQuery()); using var reader = (OracleDataReader)ExecuteReader(query); var state = new IndexColumnReaderState(context.Catalog); while (reader.Read()) { ReadIndexColumnData(reader, ref state); } }
private async Task ExtractIndexesAsync(ExtractionContext context, CancellationToken token) { var query = context.PerformReplacements(GetExtractIndexesQuery()); var reader = (OracleDataReader) await ExecuteReaderAsync(query, token).ConfigureAwait(false); await using (reader.ConfigureAwait(false)) { var state = new IndexColumnReaderState(context.Catalog); while (await reader.ReadAsync(token).ConfigureAwait(false)) { ReadIndexColumnData(reader, ref state); } } }