Exemple #1
0
 public void SetExtractionContext(StringWithDependencies contextItemName, WebsiteCrawlingSettings.DocumentTypes contextDocumentType)
 {
     if (contextItemName != null)
     {
         Context = new ExtractionContext(contextItemName, contextDocumentType);
     }
 }
Exemple #2
0
        private async Task ExtractColumnsAsync(ExtractionContext context, CancellationToken token)
        {
            var query = BuildExtractColumnsQuery(context);

            var            currentTableId = 0;
            var            cmd            = Connection.CreateCommand(query);
            ColumnResolver columnResolver = null;

            await using (cmd.ConfigureAwait(false)) {
                var reader = await cmd.ExecuteReaderAsync(token).ConfigureAwait(false);

                await using (reader.ConfigureAwait(false)) {
                    while (await reader.ReadAsync(token).ConfigureAwait(false))
                    {
                        ReadColumnData(context, reader, ref currentTableId, ref columnResolver);
                    }
                }
            }

            query = BuildExtractIdentityColumnsQuery(context);

            cmd = Connection.CreateCommand(query);
            await using (cmd.ConfigureAwait(false)) {
                var reader = await cmd.ExecuteReaderAsync(token).ConfigureAwait(false);

                await using (reader.ConfigureAwait(false)) {
                    while (await reader.ReadAsync(token).ConfigureAwait(false))
                    {
                        ReadIdentityColumnData(reader, context);
                    }
                }
            }
        }
Exemple #3
0
        private void ExtractColumns(ExtractionContext context)
        {
            var query = BuildExtractColumnsQuery(context);

            var            currentTableId = 0;
            ColumnResolver columnResolver = null;

            using (var cmd = Connection.CreateCommand(query))
                using (var reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        ReadColumnData(context, reader, ref currentTableId, ref columnResolver);
                    }
                }

            query = BuildExtractIdentityColumnsQuery(context);

            using (var cmd = Connection.CreateCommand(query))
                using (var reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        ReadIdentityColumnData(reader, context);
                    }
                }
        }
Exemple #4
0
        private string MakeSchemaFilter(ExtractionContext context)
        {
            if (context.TargetSchemas.Count == 0)
            {
                return(" > 0");
            }

            var builder = new StringBuilder();

            foreach (var targetSchemaName in context.TargetSchemas)
            {
                var schema = context.Catalog.Schemas[targetSchemaName];
                if (schema == null)
                {
                    throw new InvalidOperationException("Cannot build schema filter because schemas haven't been extracted yet. Extract schemas first.");
                }
                if (!context.ReversedSchemaIndex.TryGetValue(schema, out var schemaId))
                {
                    continue;
                }

                _ = builder.Append(builder.Length == 0
          ? schemaId.ToString(CultureInfo.InvariantCulture)
          : $", {schemaId.ToString(CultureInfo.InvariantCulture)}");
            }
            return($" IN ({builder})");
        }
Exemple #5
0
        /// <inheritdoc/>
        protected override ISqlCompileUnit BuildExtractTableAndViewColumnsQuery(ExtractionContext context)
        {
            var tableMap           = context.TableMap;
            var viewMap            = context.ViewMap;
            var columnsTable       = PgAttribute;
            var defaultValuesTable = PgAttrDef;
            var typesTable         = PgType;

            var select = SqlDml.Select(columnsTable
                                       .LeftOuterJoin(defaultValuesTable,
                                                      columnsTable["attrelid"] == defaultValuesTable["adrelid"] &&
                                                      columnsTable["attnum"] == defaultValuesTable["adnum"])
                                       .InnerJoin(typesTable, typesTable["oid"] == columnsTable["atttypid"]));

            select.Where = columnsTable["attisdropped"] == false &&
                           columnsTable["attnum"] > 0 &&
                           (SqlDml.In(columnsTable["attrelid"], CreateOidRow(tableMap.Keys)) ||
                            SqlDml.In(columnsTable["attrelid"], CreateOidRow(viewMap.Keys)));

            select.Columns.Add(columnsTable["attrelid"]);
            select.Columns.Add(columnsTable["attnum"]);
            select.Columns.Add(columnsTable["attname"]);
            select.Columns.Add(typesTable["typname"]);
            select.Columns.Add(columnsTable["atttypmod"]);
            select.Columns.Add(columnsTable["attnotnull"]);
            select.Columns.Add(columnsTable["atthasdef"]);
            select.Columns.Add(SqlDml.ColumnRef(SqlDml.Column(
                                                    SqlDml.FunctionCall("pg_get_expr", defaultValuesTable["adbin"], defaultValuesTable["adrelid"])), "adsrc"));
            select.OrderBy.Add(columnsTable["attrelid"]);
            select.OrderBy.Add(columnsTable["attnum"]);
            return(select);
        }
Exemple #6
0
        private string BuildExtractForeignKeysQuery(ExtractionContext context)
        {
            var query = @"
  SELECT
    fk.schema_id,
    fk.object_id,
    fk.name,
    fk.delete_referential_action,
    fk.update_referential_action,
    fkc.constraint_column_id,
    fkc.parent_object_id,
    fkc.parent_column_id,
    fkc.referenced_object_id,
    fkc.referenced_column_id
  FROM {CATALOG}.sys.foreign_keys fk
  INNER JOIN {CATALOG}.sys.foreign_key_columns fkc
    ON fk.object_id = fkc.constraint_object_id
  WHERE fk.schema_id {SCHEMA_FILTER}
  ORDER BY
    fk.schema_id,
    fkc.parent_object_id,
    fk.object_id,
    fkc.constraint_column_id";

            query = context.PerformReplacements(query);
            return(query);
        }
Exemple #7
0
        private string BuildExtractTablesAndViewsQuery(ExtractionContext context)
        {
            var query = @"
  SELECT
    t.schema_id,
    t.object_id,
    t.name,
    t.type
  FROM (
    SELECT
      schema_id,
      object_id,
      name,
      0 type
    FROM {CATALOG}.sys.tables
    WHERE {SYSTABLE_FILTER}
    UNION 
    SELECT
      schema_id,
      object_id,
      name,
      1 type
    FROM {CATALOG}.sys.views
    ) AS t
  WHERE t.schema_id {SCHEMA_FILTER}
  ORDER BY t.schema_id, t.object_id";

            query = context.PerformReplacements(query);
            return(query);
        }
Exemple #8
0
        private void ReadTypeData(DbDataReader reader, ExtractionContext context)
        {
            var userTypeId   = reader.GetInt32(1);
            int systemTypeId = reader.GetByte(2);
            var name         = reader.GetString(3);

            context.TypeNameIndex[userTypeId] = name;

            // Type is not user-defined
            if (!reader.GetBoolean(7))
            {
                return;
            }

            // Unknown system type
            string systemTypeName;

            if (!context.TypeNameIndex.TryGetValue(systemTypeId, out systemTypeName))
            {
                return;
            }

            var currentSchema = context.SchemaIndex[reader.GetInt32(0)];
            var dataType      = GetValueType(systemTypeName, reader.GetByte(4), reader.GetByte(5), reader.GetInt16(6));
            var domain        = currentSchema.CreateDomain(name, dataType);

            context.DomainIndex[userTypeId] = domain;
        }
Exemple #9
0
 private void ExtractCheckConstraints(ExtractionContext context)
 {
     using var reader = ExecuteReader(context.PerformReplacements(GetExtractCheckConstraintsQuery()));
     while (reader.Read())
     {
         ReadCheckConstraintData(reader, context.Catalog);
     }
 }
Exemple #10
0
 private void ExtractSequences(ExtractionContext context)
 {
     using var reader = ExecuteReader(context.PerformReplacements(GetExtractSequencesQuery()));
     while (reader.Read())
     {
         ReadSequenceData(reader, context.Catalog);
     }
 }
Exemple #11
0
        private void ReadColumnData(ExtractionContext context, DbDataReader reader, ref int currentTableId, ref ColumnResolver columnResolver)
        {
            var tableId  = reader.GetInt32(1);
            var columnId = reader.GetInt32(2);

            GetDataTable(tableId, context, ref currentTableId, ref columnResolver);


            // Table column
            if (columnResolver.Table is Table table)
            {
                var typeId      = reader.GetInt32(4);
                var sqlDataType = GetValueType(context.TypeNameIndex[typeId], reader.GetByte(5), reader.GetByte(6), reader.GetInt16(7));
                var column      = table.CreateColumn(reader.GetString(3), sqlDataType);
                var count       = table.TableColumns.Count;

                // <-db column index is not equal to column position in table.Columns. This is common after column removals or insertions.
                columnResolver.RegisterColumnMapping(columnId, count - 1);

                // Domain
                if (context.DomainIndex.TryGetValue(typeId, out var domain))
                {
                    column.Domain = domain;
                }

                // Collation
                if (!reader.IsDBNull(8))
                {
                    var currentSchema = context.SchemaIndex[reader.GetInt32(0)];
                    var collationName = reader.GetString(8);
                    column.Collation = currentSchema.Collations[collationName] ?? currentSchema.CreateCollation(collationName);
                }

                // Nullability
                column.IsNullable = reader.GetBoolean(9);

                // Default constraint
                if (!reader.IsDBNull(11))
                {
                    _ = table.CreateDefaultConstraint(reader.GetString(11), column);
                    column.DefaultValue = reader.GetString(12).StripRoundBrackets();
                }

                // Computed column
                if (!reader.IsDBNull(13))
                {
                    column.IsPersisted = reader.GetBoolean(13);
                    column.Expression  = SqlDml.Native(reader.GetString(14));
                }
            }
            else
            {
                var view = (View)columnResolver.Table;
                _ = view.CreateColumn(reader.GetString(3));
            }
        }
Exemple #12
0
        private void ExtractViewColumns(ExtractionContext context)
        {
            using var reader = ExecuteReader(context.PerformReplacements(GetExtractViewColumnsQuery()));
            var state = new ColumnReaderState <View>(context.Catalog);

            while (reader.Read())
            {
                ReadViewColumnData(reader, ref state);
            }
        }
        /// <inheritdoc/>
        protected override ISqlCompileUnit BuildExtractSequencesQuery(ExtractionContext context)
        {
            var sequenceMap = context.SequenceMap;
            // select all the sequences registered in map
            var tableRef = PgSequence;
            var select   = SqlDml.Select(tableRef);

            select.Where = SqlDml.In(tableRef["seqrelid"], SqlDml.Array(sequenceMap.Keys.ToArray()));
            return(select);
        }
Exemple #14
0
        private void GetDataTable(int id, ExtractionContext context, ref int currentId, ref ColumnResolver currentObj)
        {
            if (id == currentId)
            {
                return;
            }

            currentObj = context.ColumnResolverIndex[id];
            currentId  = id;
        }
Exemple #15
0
        private void ReadSchemaData(DbDataReader reader, ExtractionContext context)
        {
            var identifier = reader.GetInt32(0);
            var name       = reader.GetString(1);
            var schema     = context.Catalog.Schemas[name] ?? context.Catalog.CreateSchema(name);

            context.SchemaIndex[identifier]     = schema;
            context.ReversedSchemaIndex[schema] = identifier;
            schema.Owner = reader.GetString(2);
        }
Exemple #16
0
        private void ExtractForeignKeys(ExtractionContext context)
        {
            using var reader = ExecuteReader(context.PerformReplacements(GetExtractForeignKeysQuery()));
            var state = new ForeignKeyReaderState(context.Catalog);

            while (reader.Read())
            {
                ReadForeignKeyColumnData(reader, ref state);
            }
        }
Exemple #17
0
 protected virtual void ExtractCatalogContents(ExtractionContext context)
 {
     ExtractSchemas(context);
     RegisterReplacements(context);
     ExtractTypes(context);
     ExtractTablesAndViews(context);
     ExtractColumns(context);
     ExtractIndexes(context);
     ExtractForeignKeys(context);
     ExtractFulltextIndexes(context);
 }
Exemple #18
0
        private ExtractionContext CreateContext(string catalogName, string[] schemaNames)
        {
            var catalog = new Catalog(catalogName);
            var context = new ExtractionContext(catalog, schemaNames);

            foreach (var schemaName in schemaNames)
            {
                _ = catalog.CreateSchema(schemaName);
            }
            return(context);
        }
Exemple #19
0
        private void ExtractTablesAndViews(ExtractionContext context)
        {
            var query = BuildExtractTablesAndViewsQuery(context);

            using var cmd    = Connection.CreateCommand(query);
            using var reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                ReadTableOrViewData(reader, context);
            }
        }
Exemple #20
0
        // Types & domains must be extracted for all schemas
        private void ExtractTypes(ExtractionContext context)
        {
            var query = BuildExtractTypesQuery(context);

            using var command = Connection.CreateCommand(query);
            using var reader  = command.ExecuteReader();
            while (reader.Read())
            {
                ReadTypeData(reader, context);
            }
        }
        /// <inheritdoc/>
        protected override void ReadSequenceDescriptor(DbDataReader dataReader, ExtractionContext context)
        {
            var seqId      = Convert.ToInt64(dataReader["seqrelid"]);
            var descriptor = context.SequenceMap[seqId].SequenceDescriptor;

            descriptor.Increment  = Convert.ToInt64(dataReader["seqincrement"]);
            descriptor.IsCyclic   = Convert.ToBoolean(dataReader["seqcycle"]);
            descriptor.MinValue   = Convert.ToInt64(dataReader["seqmin"]);
            descriptor.MaxValue   = Convert.ToInt64(dataReader["seqmax"]);
            descriptor.StartValue = Convert.ToInt64(dataReader["seqstart"]);
        }
Exemple #22
0
 private async Task ExtractCatalogContentsAsync(ExtractionContext context, CancellationToken token)
 {
     await ExtractTablesAsync(context, token).ConfigureAwait(false);
     await ExtractTableColumnsAsync(context, token).ConfigureAwait(false);
     await ExtractViewsAsync(context, token).ConfigureAwait(false);
     await ExtractViewColumnsAsync(context, token).ConfigureAwait(false);
     await ExtractIndexesAsync(context, token).ConfigureAwait(false);
     await ExtractForeignKeysAsync(context, token).ConfigureAwait(false);
     await ExtractCheckConstraintsAsync(context, token).ConfigureAwait(false);
     await ExtractUniqueAndPrimaryKeyConstraintsAsync(context, token).ConfigureAwait(false);
 }
Exemple #23
0
        /// <inheritdoc/>
        protected override void ReadSequenceDescriptor(DbDataReader dataReader, ExtractionContext context)
        {
            var seqId      = Convert.ToInt64(dataReader["id"]);
            var descriptor = context.SequenceMap[seqId].SequenceDescriptor;

            descriptor.Increment  = Convert.ToInt64(dataReader["increment_by"]);
            descriptor.IsCyclic   = Convert.ToBoolean(dataReader["is_cycled"]);
            descriptor.MinValue   = Convert.ToInt64(dataReader["min_value"]);
            descriptor.MaxValue   = Convert.ToInt64(dataReader["max_value"]);
            descriptor.StartValue = Convert.ToInt64(dataReader["start_value"]);
        }
Exemple #24
0
        private void ExtractViews(ExtractionContext context)
        {
            var query = context.PerformReplacements(GetExtractViewsQuery());

            using var command = Connection.CreateCommand(query);
            using var reader  = command.ExecuteReader();
            while (reader.Read())
            {
                ReadViewData(reader, context.Catalog);
            }
        }
Exemple #25
0
 private void ExtractCatalogContents(ExtractionContext context)
 {
     ExtractTables(context);
     ExtractTableColumns(context);
     ExtractViews(context);
     ExtractViewColumns(context);
     ExtractIndexes(context);
     ExtractForeignKeys(context);
     ExtractCheckConstraints(context);
     ExtractUniqueAndPrimaryKeyConstraints(context);
 }
Exemple #26
0
        protected virtual async Task ExtractCatalogContentsAsync(ExtractionContext context, CancellationToken token)
        {
            await ExtractSchemasAsync(context, token).ConfigureAwait(false);

            RegisterReplacements(context);
            await ExtractTypesAsync(context, token).ConfigureAwait(false);
            await ExtractTablesAndViewsAsync(context, token).ConfigureAwait(false);
            await ExtractColumnsAsync(context, token).ConfigureAwait(false);
            await ExtractIndexesAsync(context, token).ConfigureAwait(false);
            await ExtractForeignKeysAsync(context, token).ConfigureAwait(false);
            await ExtractFulltextIndexesAsync(context, token).ConfigureAwait(false);
        }
Exemple #27
0
        // All schemas
        private void ExtractSchemas(ExtractionContext context)
        {
            var query = BuildExtractSchemasQuery(context);

            using (var cmd = Connection.CreateCommand(query))
                using (var reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        ReadSchemaData(reader, context);
                    }
                }
        }
Exemple #28
0
        private async Task ExtractSequencesAsync(ExtractionContext context, CancellationToken token)
        {
            var query  = context.PerformReplacements(GetExtractSequencesQuery());
            var reader = await ExecuteReaderAsync(query, token).ConfigureAwait(false);

            await using (reader.ConfigureAwait(false)) {
                while (await reader.ReadAsync(token).ConfigureAwait(false))
                {
                    ReadSequenceData(reader, context.Catalog);
                }
            }
        }
Exemple #29
0
        protected virtual string BuildExtractIndexesQuery(ExtractionContext context)
        {
            var query = @"
  SELECT
    t.schema_id,
    t.object_id,
    t.type,
    i.index_id,
    i.name,
    i.type,
    i.is_primary_key,
    i.is_unique,
    i.is_unique_constraint,
    i.fill_factor,
    ic.column_id,
    0,
    ic.key_ordinal,
    ic.is_descending_key,
    ic.is_included_column,
    NULL,
    NULL
  FROM {CATALOG}.sys.indexes i
  INNER JOIN (
    SELECT
      schema_id,
      object_id,
      0 AS type
    FROM {CATALOG}.sys.tables
    WHERE {SYSTABLE_FILTER}
    UNION
    SELECT
      schema_id,
      object_id,
      1 AS type
    FROM {CATALOG}.sys.views
    ) AS t
      ON i.object_id = t.object_id
  INNER JOIN {CATALOG}.sys.index_columns ic
    ON i.object_id = ic.object_id
      AND i.index_id = ic.index_id
  WHERE i.type IN(1, 2, 4)
    AND schema_id {SCHEMA_FILTER}
  ORDER BY
    t.schema_id,
    t.object_id,
    i.index_id,
    ic.is_included_column,
    ic.key_ordinal,
    ic.index_column_id";

            query = context.PerformReplacements(query);
            return(query);
        }
Exemple #30
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);
            }
        }