コード例 #1
0
        public override void Generate(RenameSequenceOperation operation, IModel model, SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            var separate = false;
            var name = operation.Name;
            if (operation.NewName != null)
            {
                var qualifiedName = new StringBuilder();
                if (operation.Schema != null)
                {
                    qualifiedName
                        .Append(operation.Schema)
                        .Append(".");
                }
                qualifiedName.Append(operation.Name);

                Rename(qualifiedName.ToString(), operation.NewName, builder);

                separate = true;
                name = operation.NewName;
            }

            if (operation.NewSchema != null)
            {
                if (separate)
                {
                    builder.AppendLine(_sql.BatchCommandSeparator);
                }

                Transfer(operation.NewSchema, operation.Schema, name, builder);
            }
        }
コード例 #2
0
        public void SqlBatchBuilder_correctly_produces_multiple_batches()
        {
            var batchBuilder = new SqlBatchBuilder();
            batchBuilder.AppendLine("Statement1");
            batchBuilder.EndBatch();
            batchBuilder.AppendLine("Statement2");
            batchBuilder.AppendLine("Statement3");
            batchBuilder.EndBatch();
            batchBuilder.AppendLine("Statement4");
            batchBuilder.AppendLine("Statement5");
            batchBuilder.AppendLine("Statement6");
            batchBuilder.EndBatch();

            Assert.Equal(3, batchBuilder.SqlBatches.Count);

            Assert.Equal(
                @"Statement1
", batchBuilder.SqlBatches[0].Sql);

            Assert.Equal(
                @"Statement2
Statement3
", batchBuilder.SqlBatches[1].Sql);

            Assert.Equal(
                @"Statement4
Statement5
Statement6
", batchBuilder.SqlBatches[2].Sql);
        }
コード例 #3
0
        public void SqlBatchBuilder_correctly_groups_multiple_statements_into_one_batch()
        {
            var batchBuilder = new SqlBatchBuilder();
            batchBuilder.AppendLine("Statement1");
            batchBuilder.AppendLine("Statement2");
            batchBuilder.AppendLine("Statement3");
            batchBuilder.EndBatch();

            Assert.Equal(1, batchBuilder.SqlBatches.Count);
            Assert.Equal(
                @"Statement1
Statement2
Statement3
", batchBuilder.SqlBatches[0].Sql);
        }
コード例 #4
0
        public void SqlBatchBuilder_ignores_empty_batches()
        {
            var batchBuilder = new SqlBatchBuilder();
            batchBuilder.AppendLine("Statement1");
            batchBuilder.EndBatch();
            batchBuilder.EndBatch();
            batchBuilder.EndBatch();
            batchBuilder.AppendLine("Statement2");
            batchBuilder.AppendLine("Statement3");
            batchBuilder.EndBatch();
            batchBuilder.EndBatch();

            Assert.Equal(2, batchBuilder.SqlBatches.Count);

            Assert.Equal(
                @"Statement1
", batchBuilder.SqlBatches[0].Sql);

            Assert.Equal(
                @"Statement2
Statement3
", batchBuilder.SqlBatches[1].Sql);
        }
コード例 #5
0
        public virtual void Generate([NotNull] CreateTableOperation createTableOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(createTableOperation, "createTableOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            EnsureSchema(createTableOperation.TableName.Schema, batchBuilder);

            batchBuilder
            .Append("CREATE TABLE ")
            .Append(DelimitIdentifier(createTableOperation.TableName))
            .AppendLine(" (");

            using (batchBuilder.Indent())
            {
                GenerateColumns(createTableOperation, batchBuilder);

                GenerateTableConstraints(createTableOperation, batchBuilder);
            }

            batchBuilder
            .AppendLine()
            .Append(")");
        }
コード例 #6
0
        public override void ColumnDefinition(
            string schema,
            string table,
            string name,
            string type,
            bool nullable,
            object defaultValue,
            string defaultExpression,
            IAnnotatable annotatable,
            IModel model,
            SqlBatchBuilder builder)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotEmpty(type, nameof(type));
            Check.NotNull(annotatable, nameof(annotatable));
            Check.NotNull(builder, nameof(builder));

            var computedExpression = annotatable[SqlServerAnnotationNames.Prefix
                + SqlServerAnnotationNames.ColumnComputedExpression];
            if (computedExpression != null)
            {
                builder
                    .Append(_sql.DelimitIdentifier(name))
                    .Append(" AS ")
                    .Append(computedExpression);

                return;
            }

            base.ColumnDefinition(
                schema,
                table,
                name,
                type,
                nullable,
                defaultValue,
                defaultExpression,
                annotatable,
                model,
                builder);

            var valueGeneration = (string)annotatable[SqlServerAnnotationNames.Prefix + SqlServerAnnotationNames.ValueGeneration];
            if (valueGeneration == "Identity")
            {
                builder.Append(" IDENTITY");
            }
        }
コード例 #7
0
        public virtual void Generate([NotNull] AlterColumnOperation alterColumnOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(alterColumnOperation, "alterColumnOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            var newColumn = alterColumnOperation.NewColumn;

            batchBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(alterColumnOperation.TableName))
            .Append(" ALTER COLUMN ")
            .Append(DelimitIdentifier(newColumn.Name))
            .Append(" ");

            GenerateColumnType(alterColumnOperation.TableName, newColumn, batchBuilder);

            batchBuilder
            .Append(newColumn.IsNullable ? " NULL" : " NOT NULL");
        }
コード例 #8
0
 protected abstract void Generate(
     [NotNull] AlterColumnOperation operation,
     [CanBeNull] IModel model,
     [NotNull] SqlBatchBuilder builder);
コード例 #9
0
 protected abstract void Generate(
     [NotNull] EnsureSchemaOperation operation,
     [CanBeNull] IModel model,
     [NotNull] SqlBatchBuilder builder);
コード例 #10
0
 protected override void Generate(EnsureSchemaOperation operation, IModel model, SqlBatchBuilder builder)
 {
 }
コード例 #11
0
 protected override void Generate(AlterColumnOperation operation, IModel model, SqlBatchBuilder builder)
 {
 }
コード例 #12
0
        public virtual void Generate([NotNull] DropIndexOperation dropIndexOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(dropIndexOperation, "dropIndexOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("DROP INDEX ")
            .Append(DelimitIdentifier(dropIndexOperation.IndexName));
        }
コード例 #13
0
 public abstract void Generate([NotNull] RenameIndexOperation renameIndexOperation, [NotNull] SqlBatchBuilder batchBuilder);
コード例 #14
0
        public virtual void Generate([NotNull] DropForeignKeyOperation dropForeignKeyOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(dropForeignKeyOperation, "dropForeignKeyOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(dropForeignKeyOperation.TableName))
            .Append(" DROP CONSTRAINT ")
            .Append(DelimitIdentifier(dropForeignKeyOperation.ForeignKeyName));
        }
コード例 #15
0
        public virtual void Generate([NotNull] CreateIndexOperation createIndexOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(createIndexOperation, "createIndexOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder.Append("CREATE");

            if (createIndexOperation.IsUnique)
            {
                batchBuilder.Append(" UNIQUE");
            }

            // TODO: Move to SqlServer
            if (createIndexOperation.IsClustered)
            {
                batchBuilder.Append(" CLUSTERED");
            }

            batchBuilder
            .Append(" INDEX ")
            .Append(DelimitIdentifier(createIndexOperation.IndexName))
            .Append(" ON ")
            .Append(DelimitIdentifier(createIndexOperation.TableName))
            .Append(" (")
            .Append(createIndexOperation.ColumnNames.Select(DelimitIdentifier).Join())
            .Append(")");
        }
コード例 #16
0
        public virtual void Generate([NotNull] AddForeignKeyOperation addForeignKeyOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(addForeignKeyOperation, "addForeignKeyOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(addForeignKeyOperation.TableName))
            .Append(" ADD ");

            GenerateForeignKey(addForeignKeyOperation, batchBuilder);
        }
コード例 #17
0
        public virtual void Generate([NotNull] DropDefaultConstraintOperation dropDefaultConstraintOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(dropDefaultConstraintOperation, "dropDefaultConstraintOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(dropDefaultConstraintOperation.TableName))
            .Append(" ALTER COLUMN ")
            .Append(DelimitIdentifier(dropDefaultConstraintOperation.ColumnName))
            .Append(" DROP DEFAULT");
        }
コード例 #18
0
        public virtual void Generate([NotNull] AddDefaultConstraintOperation addDefaultConstraintOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(addDefaultConstraintOperation, "addDefaultConstraintOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(addDefaultConstraintOperation.TableName))
            .Append(" ALTER COLUMN ")
            .Append(DelimitIdentifier(addDefaultConstraintOperation.ColumnName))
            .Append(" SET DEFAULT ");

            batchBuilder.Append(addDefaultConstraintOperation.DefaultSql ?? GenerateLiteral((dynamic)addDefaultConstraintOperation.DefaultValue));
        }
コード例 #19
0
 public override void Generate(RenameIndexOperation operation, IModel model, SqlBatchBuilder builder)
 {
     throw new NotImplementedException();
 }
コード例 #20
0
 protected abstract void EnsureSchema([CanBeNull] string schema, [NotNull] SqlBatchBuilder batchBuilder);
コード例 #21
0
 public override void Generate(AlterColumnOperation operation, IModel model, SqlBatchBuilder builder)
 {
     throw new NotImplementedException();
 }
コード例 #22
0
 protected virtual void GenerateColumnTraits(SchemaQualifiedName tableName,
                                             [NotNull] Column column, [NotNull] SqlBatchBuilder batchBuilder)
 {
 }
コード例 #23
0
 protected override void Generate(RenameIndexOperation operation, IModel model, SqlBatchBuilder builder)
 {
 }
コード例 #24
0
 protected virtual void GeneratePrimaryKeyTraits(
     [NotNull] AddPrimaryKeyOperation primaryKeyOperation,
     [NotNull] SqlBatchBuilder batchBuilder)
 {
 }
コード例 #25
0
 public override void GenerateSql(
     MigrationOperationSqlGenerator generator,
     SqlBatchBuilder batchBuilder)
 {
 }
コード例 #26
0
        protected override void Generate(RenameIndexOperation operation, IModel model, SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            GenerateRename(
                _sql.EscapeLiteral(operation.Table) + "." + _sql.EscapeLiteral(operation.Name),
                operation.Schema,
                operation.NewName,
                "INDEX",
                builder);
        }
コード例 #27
0
 protected abstract void Generate(
     [NotNull] RenameTableOperation operation,
     [CanBeNull] IModel model,
     [NotNull] SqlBatchBuilder builder);
コード例 #28
0
        public override void ForeignKeyAction(ReferentialAction referentialAction, SqlBatchBuilder builder)
        {
            Check.NotNull(builder, nameof(builder));

            if (referentialAction == ReferentialAction.Restrict)
            {
                builder.Append("NO ACTION");
            }
            else
            {
                base.ForeignKeyAction(referentialAction, builder);
            }
        }
コード例 #29
0
 protected abstract void Generate(
     [NotNull] DropIndexOperation operation,
     [CanBeNull] IModel model,
     [NotNull] SqlBatchBuilder builder);
コード例 #30
0
        public virtual void Generate([NotNull] DropTableOperation dropTableOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(dropTableOperation, "dropTableOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("DROP TABLE ")
            .Append(DelimitIdentifier(dropTableOperation.TableName));
        }
コード例 #31
0
        public override void IndexTraits(MigrationOperation operation, IModel model, SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            var clustered = (string)operation[SqlServerAnnotationNames.Prefix + SqlServerAnnotationNames.Clustered];
            if (clustered != null)
            {
                builder.Append(clustered == "True" ? "CLUSTERED " : "NONCLUSTERED ");
            }
        }
コード例 #32
0
 public abstract void Generate([NotNull] MoveTableOperation moveTableOperation, [NotNull] SqlBatchBuilder batchBuilder);
コード例 #33
0
        protected override void GeneratePrimaryKeyTraits(AddPrimaryKeyOperation operation, SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            if (operation[NpgsqlAnnotationNames.Prefix + NpgsqlAnnotationNames.Clustered] != bool.TrueString)
            {
                builder.Append(" NONCLUSTERED");
            }
        }
コード例 #34
0
        protected virtual void GenerateTableConstraints([NotNull] CreateTableOperation createTableOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(createTableOperation, "createTableOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            var addPrimaryKeyOperation = createTableOperation.PrimaryKey;

            if (addPrimaryKeyOperation != null)
            {
                batchBuilder.AppendLine(",");

                GeneratePrimaryKey(addPrimaryKeyOperation, batchBuilder);
            }

            foreach (var addUniqueConstraintOperation in createTableOperation.UniqueConstraints)
            {
                batchBuilder.AppendLine(",");

                GenerateUniqueConstraint(addUniqueConstraintOperation, batchBuilder);
            }
        }
コード例 #35
0
        protected override void Generate(MoveSequenceOperation operation, IModel model, SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            GenerateMove(operation.Name, operation.Schema, operation.NewSchema, builder);
        }
コード例 #36
0
        protected override void Generate(RenameTableOperation operation, IModel model, SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            GenerateRename(operation.Name, operation.Schema, operation.NewName, "OBJECT", builder);
        }
コード例 #37
0
        public void SqlBatchBuilder_correctly_splits_statements_to_multiple_batches_when_transaction_is_suppressed()
        {
            var batchBuilder = new SqlBatchBuilder();
            batchBuilder.AppendLine("Statement1");
            batchBuilder.AppendLine("Statement2");
            batchBuilder.AppendLine("Statement3", suppressTransaction: true);
            batchBuilder.AppendLine("Statement4");
            batchBuilder.AppendLine("Statement5");
            batchBuilder.AppendLine("Statement6", suppressTransaction: true);
            batchBuilder.AppendLine("Statement7", suppressTransaction: true);
            batchBuilder.EndBatch();

            Assert.Equal(2, batchBuilder.SqlBatches.Count);
            Assert.False(batchBuilder.SqlBatches[0].SuppressTransaction);
            Assert.Equal(
                @"Statement1
Statement2
", batchBuilder.SqlBatches[0].Sql);

            Assert.True(batchBuilder.SqlBatches[1].SuppressTransaction);
            Assert.Equal(
                @"Statement3
Statement4
Statement5
Statement6
Statement7
", batchBuilder.SqlBatches[1].Sql);
        }
コード例 #38
0
        public virtual void Generate([NotNull] AlterSequenceOperation alterSequenceOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(alterSequenceOperation, "alterSequenceOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("ALTER SEQUENCE ")
            .Append(DelimitIdentifier(alterSequenceOperation.SequenceName))
            .Append(" INCREMENT BY ")
            .Append(alterSequenceOperation.NewIncrementBy);
        }