示例#1
0
        //---- 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;
        }
示例#2
0
        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;
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
                }
            }
        }