public void Generate_can_output_create_procedure_operations()
        {
            var createProcedureOperation
                = new CreateProcedureOperation("Foo", "SELECT ShinyHead\r\nFROM Pilkingtons");

            createProcedureOperation.Parameters.Add(
                new ParameterModel(PrimitiveTypeKind.String)
                    {
                        Name = "P'",
                        DefaultValue = "Bar",
                        IsOutParameter = true
                    });

            var codeGenerator = new CSharpMigrationCodeGenerator();

            var generatedMigration
                = codeGenerator.Generate(
                    "Migration",
                    new MigrationOperation[]
                        {
                            createProcedureOperation
                        },
                    "Source",
                    "Target",
                    "Foo",
                    "Bar");

            Assert.Equal(
                @"namespace Foo
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class Bar : DbMigration
    {
        public override void Up()
        {
            CreateStoredProcedure(
                ""Foo"",
                p => new
                    {
                        P = p.String(name: ""P'"", defaultValue: ""Bar"", outParameter: true),
                    },
                body:
                    @""SELECT ShinyHead
                      FROM Pilkingtons""
            );
            
        }
        
        public override void Down()
        {
            DropStoredProcedure(""Foo"");
        }
    }
}
",
                generatedMigration.UserCode);
        }
        public void Generate_can_output_create_procedure_operations()
        {
            var createProcedureOperation
                = new CreateProcedureOperation("Foo", "SELECT ShinyHead\r\nFROM Pilkingtons");

            createProcedureOperation.Parameters.Add(
                new ParameterModel(PrimitiveTypeKind.String)
                    {
                        Name = "P'",
                        DefaultValue = "Bar",
                        IsOutParameter = true
                    });

            var codeGenerator = new VisualBasicMigrationCodeGenerator();

            var generatedMigration
                = codeGenerator.Generate(
                    "Migration",
                    new MigrationOperation[]
                        {
                            createProcedureOperation
                        },
                    "Source",
                    "Target",
                    "Foo",
                    "Bar");

            Assert.Equal(
                @"Imports System
Imports System.Data.Entity.Migrations
Imports Microsoft.VisualBasic

Namespace Foo
    Public Partial Class Bar
        Inherits DbMigration
    
        Public Overrides Sub Up()
            CreateStoredProcedure(
                ""Foo"",
                Function(p) New With
                    {
                        .P = p.String(name := ""P'"", defaultValue := ""Bar"", outParameter := True)
                    },
                body :=
                    ""SELECT ShinyHead"" & vbCrLf & _
                    ""FROM Pilkingtons""
            )
            
        End Sub
        
        Public Overrides Sub Down()
            DropStoredProcedure(""Foo"")
        End Sub
    End Class
End Namespace
",
                generatedMigration.UserCode);
        }
        public void Inverse_should_produce_drop_table_operation()
        {
            var createProcedureOperation
                = new CreateProcedureOperation("Foo", "Bar");

            var dropProcedureOperation = (DropProcedureOperation)createProcedureOperation.Inverse;

            Assert.Equal("Foo", dropProcedureOperation.Name);
        }
        public void Inverse_should_produce_drop_table_operation()
        {
            var createProcedureOperation
                = new CreateProcedureOperation("Foo", "Bar");

            var dropProcedureOperation = (DropProcedureOperation)createProcedureOperation.Inverse;

            Assert.Equal("Foo", dropProcedureOperation.Name);
        }
        public void Can_add_and_enumerate_parameters()
        {
            var createProcedureOperation = new CreateProcedureOperation("Foo", "Bar");

            createProcedureOperation.Parameters.Add(
                new ParameterModel(PrimitiveTypeKind.Int64)
                    {
                        Name = "Bar"
                    });

            Assert.NotNull(createProcedureOperation.Parameters.Single());
        }
        public void Can_add_and_enumerate_parameters()
        {
            var createProcedureOperation = new CreateProcedureOperation("Foo", "Bar");

            createProcedureOperation.Parameters.Add(
                new ParameterModel(PrimitiveTypeKind.Int64)
            {
                Name = "Bar"
            });

            Assert.NotNull(createProcedureOperation.Parameters.Single());
        }
 protected virtual IEnumerable<MigrationStatement> Generate(CreateProcedureOperation operation)
 {
     return Generate(operation, "CREATE");
 }
        /// <summary>Generates code to perform a <see cref="T:System.Data.Entity.Migrations.Model.CreateProcedureOperation" />.</summary>
        /// <param name="createProcedureOperation">The operation to generate code for.</param>
        /// <param name="writer">Text writer to add the generated code to.</param>
        protected virtual void Generate(CreateProcedureOperation createProcedureOperation, IndentedTextWriter writer)
        {
            Check.NotNull(createProcedureOperation, "createProcedureOperation");
            Check.NotNull(writer, "writer");

            Generate(createProcedureOperation, "CreateStoredProcedure", writer);
        }
        /// <summary>
        /// Generates the specified create procedure operation.
        /// </summary>
        /// <param name="createProcedureOperation">The create procedure operation.</param>
        protected virtual void Generate(CreateProcedureOperation createProcedureOperation)
        {
            Check.NotNull(createProcedureOperation, "createProcedureOperation");

            Generate(createProcedureOperation, "CREATE");
        }
 private string GenerateProcedureCmd(CreateProcedureOperation po)
 {
   StringBuilder sql = new StringBuilder();
   sql.AppendLine(string.Format("CREATE PROCEDURE `{0}`({1})", po.Name.Replace("dbo.", ""), GenerateParamSentence(po.Parameters)));
   sql.AppendLine("BEGIN ");
   sql.AppendLine(po.BodySql);
   sql.AppendLine(" END");
   return sql.ToString().Replace("@", "");
 }
 protected virtual MigrationStatement Generate(CreateProcedureOperation op)
 {
   MigrationStatement stmt = new MigrationStatement();
   stmt.Sql = GenerateProcedureCmd(op);
   return stmt;
 }
 /// <summary>
 ///     Generates the specified create procedure operation.
 /// </summary>
 /// <param name="createProcedureOperation">The create procedure operation.</param>
 protected virtual void Generate(CreateProcedureOperation createProcedureOperation)
 {
 }
        protected virtual void Generate(CreateProcedureOperation createProcedureOperation, IndentedTextWriter writer)
        {
            Check.NotNull(createProcedureOperation, "createProcedureOperation");
            Check.NotNull(writer, "writer");

            writer.WriteLine("CreateStoredProcedure(");
            writer.Indent++;
            writer.Write(Quote(createProcedureOperation.Name));
            writer.WriteLine(",");

            if (createProcedureOperation.Parameters.Any())
            {
                writer.WriteLine("p => new");
                writer.Indent++;
                writer.WriteLine("{");
                writer.Indent++;

                createProcedureOperation.Parameters.Each(
                    p =>
                        {
                            var scrubbedName = ScrubName(p.Name);

                            writer.Write(scrubbedName);
                            writer.Write(" =");
                            Generate(p, writer, !string.Equals(p.Name, scrubbedName, StringComparison.Ordinal));
                            writer.WriteLine(",");
                        });

                writer.Indent--;
                writer.WriteLine("},");
                writer.Indent--;
            }

            writer.Write("body:");

            if (!string.IsNullOrWhiteSpace(createProcedureOperation.BodySql))
            {
                writer.WriteLine();
                writer.Indent++;

                var indentString
                    = writer.NewLine
                      + new string(' ', (writer.Indent * 4) + 2);

                writer.Write("@");
                writer.WriteLine(
                    Generate(
                        createProcedureOperation
                            .BodySql
                            .Replace(Environment.NewLine, indentString)));

                writer.Indent--;
            }
            else
            {
                writer.WriteLine(" \"\"");
            }

            writer.Indent--;
            writer.WriteLine(");");
            writer.WriteLine();
        }
        private CreateProcedureOperation BuildCreateProcedureOperation(EdmFunction function, string bodySql)
        {
            DebugCheck.NotNull(function);

            var createProcedureOpeation
                = new CreateProcedureOperation(function.Name, bodySql);

            function.Parameters
                    .Each(p => createProcedureOpeation.Parameters.Add(BuildParameterModel(p, _target)));

            return createProcedureOpeation;
        }
        protected virtual void Generate(CreateProcedureOperation createProcedureOperation)
        {
            Check.NotNull(createProcedureOperation, "createProcedureOperation");

            using (var writer = Writer())
            {
                writer.WriteLine("CREATE PROCEDURE " + Name(createProcedureOperation.Name));
                writer.Indent++;

                createProcedureOperation.Parameters.Each(
                    (p, i) =>
                        {
                            Generate(p, writer);

                            if (i < createProcedureOperation.Parameters.Count - 1)
                            {
                                writer.WriteLine(",");
                            }
                        });

                writer.WriteLine();
                writer.Indent--;
                writer.WriteLine("AS");
                writer.WriteLine("BEGIN");
                writer.Indent++;

                if (!string.IsNullOrWhiteSpace(createProcedureOperation.BodySql))
                {
                    var indentString
                        = writer.NewLine
                          + new string(' ', (writer.Indent * 4));

                    var indentReplacer = new Regex(@"\r?\n *");

                    writer.WriteLine(indentReplacer.Replace(createProcedureOperation.BodySql, indentString));
                }
                else
                {
                    writer.WriteLine("RETURN");
                }

                writer.Indent--;
                writer.Write("END");

                Statement(writer, batchTerminator: "GO");
            }
        }