Example #1
0
        private static void Main(string[] args)
        {
            var dbSqlServer = new SqlServerDbProvider().GetDatabase(ConnectionString);
            var dbModel     = new PostulateDbProvider().GetDatabase(@"C:\Users\Adam\Source\Repos\Hs5\Hs5.Models\bin\Debug\Hs5.Models.dll");
            var diff        = SchemaComparison.Execute(dbModel, dbSqlServer);

            Console.WriteLine("Create:");
            foreach (var grp in diff.Create.GroupBy(row => row.GetType().Name))
            {
                Console.WriteLine(grp.Key);
                foreach (var item in grp)
                {
                    Console.WriteLine($"- {item}");
                }
            }

            foreach (var cmd in diff.GetScriptCommands(new SqlServerSyntax()))
            {
                Console.WriteLine(cmd);
                Console.WriteLine("GO");
                Console.WriteLine();
            }

            Console.ReadLine();
        }
Example #2
0
        private static void Main(string[] args)
        {
            try
            {
                if ((args?.Length ?? 0) == 0)
                {
                    Console.WriteLine("A folder name (usually a solution folder) is required to run this command.");
                    return;
                }

                var assembly = Assembly.GetExecutingAssembly();
                Console.WriteLine($"Postulate.Merge.SqlServer version {assembly.GetName().Version}");

                const string settingsFilename = "Postulate.Merge.json";
                string       path             = args[0];
                string       settingsFile     = Path.Combine(path, settingsFilename);

                if (!File.Exists(settingsFile))
                {
                    CreateEmptySettingsFile(path, settingsFilename);
                    return;
                }

                var  settings = JsonFile.Load <Settings>(settingsFile);
                bool anyDiff  = false;

                while (true)
                {
                    Console.WriteLine($"Analyzing model classes in {Path.GetFileName(settings.SourceAssembly)}...");
                    var sourceDb = new PostulateDbProvider <SqlServerIntegrator>().GetDatabase(settings.SourceAssembly);

                    string connectionString = ResolveConnectionString(settings, path);
                    var    targetProvider   = new SqlServerDbProvider();

                    var connectionInfo = ConnectionStrings.Parse(connectionString);
                    Console.WriteLine($"Analyzing target database {connectionInfo.TryGetValues("Data Source", "Database")}...");
                    var targetDb = targetProvider.GetDatabaseAsync(connectionString).Result;

                    var syntax = targetProvider.GetDefaultSyntax();

                    Console.WriteLine("Looking for differences...");
                    Console.WriteLine();

                    var diff = SchemaComparison.Execute(sourceDb, targetDb, settings.ExcludeObjects);
                    if (diff.AnyDifferences())
                    {
                        anyDiff = true;
                        StringBuilder script   = new StringBuilder();
                        var           commands = diff.GetScriptCommands(syntax);
                        foreach (var cmd in commands)
                        {
                            script.AppendLine(cmd);
                        }

                        Console.WriteLine(script.ToString());

                        Console.WriteLine("Press Enter to execute, E to edit, T to save test case, or Escape to cancel:");
                        var response = Console.ReadKey();
                        switch (response.Key)
                        {
                        case ConsoleKey.Escape:
                            return;

                        case ConsoleKey.Enter:
                            Console.WriteLine("Executing script...");
                            var scriptRunner = new SqlScriptRunner(targetProvider);
                            scriptRunner.Run(connectionString, script.ToString());
                            break;

                        case ConsoleKey.E:
                            Console.WriteLine($"Starting {Path.GetFileName(settings.CommandExe)}...");
                            string scriptFile = Path.Combine(path, "Postulate.Merge.sql");
                            if (File.Exists(scriptFile))
                            {
                                File.Delete(scriptFile);
                            }
                            diff.SaveScript(syntax, scriptFile);
                            EditScript(scriptFile, settings, connectionString);
                            return;

                        case ConsoleKey.T:
                            string testCaseFile = Path.Combine(path, "Postulate.TestCase.json");
                            if (File.Exists(testCaseFile))
                            {
                                File.Delete(testCaseFile);
                            }
                            diff.SaveTestCase(testCaseFile);
                            Console.WriteLine($"Test case file {testCaseFile} was created. If you raise an issue on the SchemaSync repository (https://github.com/adamosoftware/SchemaSync), please attach the test case if appropriate.");
                            Console.ReadLine();
                            return;
                        }
                    }
                    else
                    {
                        Console.WriteLine($"No {((anyDiff) ? "more " : string.Empty)}differences found.");
                        Console.ReadLine();
                        break;
                    }
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
                Console.ReadLine();
            }
        }