public void Can_get_and_set_name_properties()
        {
            var moveTableOperation = new MoveTableOperation("dbo.Customers", "crm");

            Assert.Equal("dbo.Customers", moveTableOperation.Name);
            Assert.Equal("crm", moveTableOperation.NewSchema);
        }
        public void Inverse_should_produce_move_table_operation()
        {
            var moveTableOperation = new MoveTableOperation("dbo.My.Customers", "crm");

            var inverse = (MoveTableOperation)moveTableOperation.Inverse;

            Assert.Equal("crm.My.Customers", inverse.Name);
            Assert.Equal("dbo", inverse.NewSchema);
        }
        public void Can_get_and_set_context_key_properties()
        {
            var moveTableOperation
                = new MoveTableOperation("dbo.Customers", "crm")
                      {
                          ContextKey = "foo"
                      };

            Assert.Equal("foo", moveTableOperation.ContextKey);
        }
        protected override void Generate(MoveTableOperation moveTableOperation)
        {
            if (moveTableOperation == null)
            {
                throw new ArgumentNullException("moveTableOperation");
            }

            // turn off clustered index for all PKs (except for migration history)
            if (!moveTableOperation.CreateTableOperation.Name.Contains("__MigrationHistory"))
            {
                moveTableOperation.CreateTableOperation.PrimaryKey.IsClustered = false;
            }

            base.Generate(moveTableOperation);
        }
        /// <summary>
        /// Generates SQL for a <see cref="MoveTableOperation" />.
        /// Generated SQL should be added using the Statement method.
        /// </summary>
        /// <param name="moveTableOperation"> The operation to produce SQL for. </param>
        protected virtual void Generate(MoveTableOperation moveTableOperation)
        {
            Check.NotNull(moveTableOperation, "moveTableOperation");

            var newSchema = moveTableOperation.NewSchema ?? "dbo";

            if (!newSchema.EqualsIgnoreCase("dbo")
                && !_generatedSchemas.Contains(newSchema))
            {
                GenerateCreateSchema(newSchema);

                _generatedSchemas.Add(newSchema);
            }

            if (!moveTableOperation.IsSystem)
            {
                using (var writer = Writer())
                {
                    writer.Write("ALTER SCHEMA ");
                    writer.Write(Quote(newSchema));
                    writer.Write(" TRANSFER ");
                    writer.Write(Name(moveTableOperation.Name));

                    Statement(writer);
                }
            }
            else
            {
                Debug.Assert(moveTableOperation.CreateTableOperation != null);
                Debug.Assert(!string.IsNullOrWhiteSpace(moveTableOperation.ContextKey));

                using (var writer = Writer())
                {
                    writer.Write("IF object_id('");
                    writer.Write(moveTableOperation.CreateTableOperation.Name);
                    writer.WriteLine("') IS NULL BEGIN");
                    writer.Indent++;
                    WriteCreateTable(moveTableOperation.CreateTableOperation, writer);
                    writer.WriteLine();
                    writer.Indent--;
                    writer.WriteLine("END");

                    writer.Write("INSERT INTO ");
                    writer.WriteLine(Name(moveTableOperation.CreateTableOperation.Name));
                    writer.Write("SELECT * FROM ");
                    writer.WriteLine(Name(moveTableOperation.Name));
                    writer.Write("WHERE [ContextKey] = ");
                    writer.WriteLine(Generate(moveTableOperation.ContextKey));

                    writer.Write("DELETE ");
                    writer.WriteLine(Name(moveTableOperation.Name));
                    writer.Write("WHERE [ContextKey] = ");
                    writer.WriteLine(Generate(moveTableOperation.ContextKey));

                    writer.Write("IF NOT EXISTS(SELECT * FROM ");
                    writer.Write(Name(moveTableOperation.Name));
                    writer.WriteLine(")");
                    writer.Indent++;
                    writer.Write("DROP TABLE ");
                    writer.Write(Name(moveTableOperation.Name));
                    writer.Indent--;

                    Statement(writer);
                }
            }
        }
        //private void CreateExtension(string exensionName)
        //{
        //    //This is compatible only with server 9.1+
        //    if (serverVersion.Major > 9 || (serverVersion.Major == 9 && serverVersion.Minor >= 1))
        //    {
        //        if (addedExtensions.Contains(exensionName))
        //            return;
        //        addedExtensions.Add(exensionName);
        //        AddStatment("CREATE EXTENSION IF NOT EXISTS \"" + exensionName + "\"");
        //    }
        //}

        private void Convert(MoveTableOperation moveTableOperation)
        {
            StringBuilder sql = new StringBuilder();
            var newSchema = moveTableOperation.NewSchema ?? "dbo";
            CreateSchema(newSchema);
            sql.Append("ALTER TABLE ");
            AppendTableName(moveTableOperation.Name, sql);
            sql.Append(" SET SCHEMA ");
            sql.Append(newSchema);
            AddStatment(sql);
        }
        public void Generate_can_output_move_table_as_system_object_statement()
        {
            var createTableOperation
                = new CreateTableOperation("dbo.History");

            createTableOperation.Columns.Add(
                new ColumnModel(PrimitiveTypeKind.Int32)
                    {
                        Name = "Id",
                        IsNullable = false
                    });

            createTableOperation.Columns.Add(
                new ColumnModel(PrimitiveTypeKind.String)
                    {
                        Name = "Name",
                        IsNullable = false
                    });

            var moveTableOperation
                = new MoveTableOperation("dbo.History", "foo")
                      {
                          IsSystem = true,
                          ContextKey = "MyKey",
                          CreateTableOperation = createTableOperation
                      };

            var migrationSqlGenerator = new SqlServerMigrationSqlGenerator();

            var sql = migrationSqlGenerator.Generate(new[] { moveTableOperation }, "2008").Join(s => s.Sql, Environment.NewLine);

            Assert.Contains(
                @"IF schema_id('foo') IS NULL
    EXECUTE('CREATE SCHEMA [foo]')
IF object_id('dbo.History') IS NULL BEGIN
    CREATE TABLE [dbo].[History] (
        [Id] [int] NOT NULL,
        [Name] [nvarchar](max) NOT NULL
    )
END
INSERT INTO [dbo].[History]
SELECT * FROM [dbo].[History]
WHERE [ContextKey] = 'MyKey'
DELETE [dbo].[History]
WHERE [ContextKey] = 'MyKey'
IF NOT EXISTS(SELECT * FROM [dbo].[History])
    DROP TABLE [dbo].[History]", sql);
        }
        /// <summary>
        ///     Generates code to perform a <see cref = "MoveTableOperation" />.
        /// </summary>
        /// <param name = "moveTableOperation">The operation to generate code for.</param>
        /// <param name = "writer">Text writer to add the generated code to.</param>
        protected virtual void Generate(MoveTableOperation moveTableOperation, IndentedTextWriter writer)
        {
            Contract.Requires(moveTableOperation != null);
            Contract.Requires(writer != null);

            writer.Write("MoveTable(name := ");
            writer.Write(Quote(moveTableOperation.Name));
            writer.Write(", newSchema := ");
            writer.Write(
                string.IsNullOrWhiteSpace(moveTableOperation.NewSchema)
                    ? "Nothing"
                    : Quote(moveTableOperation.NewSchema));
            writer.WriteLine(")");
        }
        /// <summary>
        ///     Generates SQL for a <see cref = "MoveTableOperation" />.
        ///     Generated SQL should be added using the Statement method.
        /// </summary>
        /// <param name = "moveTableOperation">The operation to produce SQL for.</param>
        protected virtual void Generate(MoveTableOperation moveTableOperation)
        {
            Contract.Requires(moveTableOperation != null);

            using (var writer = Writer())
            {
                var newSchema = moveTableOperation.NewSchema ?? "dbo";

                if (!newSchema.EqualsIgnoreCase("dbo")
                    && !_generatedSchemas.Contains(newSchema))
                {
                    GenerateCreateSchema(newSchema);

                    _generatedSchemas.Add(newSchema);
                }

                writer.Write("ALTER SCHEMA ");
                writer.Write(Quote(newSchema));
                writer.Write(" TRANSFER ");
                writer.Write(Name(moveTableOperation.Name));

                Statement(writer);
            }
        }
 protected virtual MigrationStatement Generate(MoveTableOperation op)
 {
     return null; // TODO :check if we'll suppport this operation
 }
		protected virtual IEnumerable<MigrationStatement> Generate(MoveTableOperation operation)
		{
			throw new NotSupportedException("Moving table is not supported by Firebird.");
		}
		protected override void Generate(MoveTableOperation moveTableOperation)
		{
			moveTableOperation.CreateTableOperation.PrimaryKey.IsClustered = false;
			base.Generate(moveTableOperation);
		}
 /// <inheritdoc />
 protected override void Generate(MoveTableOperation moveTableOperation)
 {
 }
 /// <summary>
 /// Gera SQL para uma operação <see cref="MoveTableOperation" />.
 /// </summary>
 /// <param name="opeMoveTable"> The operation to produce SQL for. </param>
 protected virtual void Generate(MoveTableOperation opeMoveTable)
 {
     //throw new NotSupportedException();
 }
        /// <summary>
        /// Generates code to perform a <see cref="MoveTableOperation" />.
        /// </summary>
        /// <param name="moveTableOperation"> The operation to generate code for. </param>
        /// <param name="writer"> Text writer to add the generated code to. </param>
        protected virtual void Generate(MoveTableOperation moveTableOperation, IndentedTextWriter writer)
        {
            Check.NotNull(moveTableOperation, "moveTableOperation");
            Check.NotNull(writer, "writer");

            writer.Write("MoveTable(name := ");
            writer.Write(Quote(moveTableOperation.Name));
            writer.Write(", newSchema := ");
            writer.Write(
                string.IsNullOrWhiteSpace(moveTableOperation.NewSchema)
                    ? "Nothing"
                    : Quote(moveTableOperation.NewSchema));
            writer.WriteLine(")");
        }
 protected override void Generate(MoveTableOperation moveTableOperation, IndentedTextWriter writer)
 {
     var move = new MoveTableOperation(TrimSchemaPrefix(moveTableOperation.Name), moveTableOperation.NewSchema);
       base.Generate(move, writer);
 }
 /// <summary>
 ///     Generates SQL for a <see cref="MoveTableOperation" />.
 ///     Generated SQL should be added using the Statement method.
 /// </summary>
 /// <param name="moveTableOperation"> The operation to produce SQL for. </param>
 protected virtual void Generate(MoveTableOperation moveTableOperation)
 {
 }
 protected virtual IEnumerable<MigrationStatement> Generate(MoveTableOperation operation)
 {
     throw new NotSupportedException("'MoveTableOperation' is not supported.");
 }
		protected override void Generate(MoveTableOperation moveTableOperation, IndentedTextWriter writer)
		{
			moveTableOperation.CreateTableOperation.PrimaryKey.IsClustered = false;
			base.Generate(moveTableOperation, writer);
		}