Пример #1
0
        public void WithScriptsAndDowngradeScriptsEmbeddedInAssembly_RunsFromFolder_SuccessfullyStoresDowngradeScripts()
        {
            // Setup
            string folderName = "DowngradeScripts";

            Func <string, bool> scriptsFilter          = s => s.EndsWith(".sql", StringComparison.OrdinalIgnoreCase) && !s.Contains($".{folderName}.") && s.Contains("FolderUpAndDownScrips");
            Func <string, bool> downgradeScriptsFilter = s => s.Contains($".{folderName}.") && s.Contains("FolderUpAndDownScrips");

            DowngradeScriptsSettings settings = new DowngradeScriptsSettings(scriptsFilter, downgradeScriptsFilter,
                                                                             new KeyValuePair <DowngradeScriptsSettingsMode, string>(DowngradeScriptsSettingsMode.Folder, folderName));

            var upgradeEngineBuilder = DeployChanges.To
                                       .SqlDatabase(connectionString)
                                       .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings)
                                       .LogToNowhere();

            // Act
            var result = upgradeEngineBuilder.BuildWithDowngrade(true).PerformUpgrade();

            //Assert
            Assert.AreEqual(true, result.Successful);

            Dictionary <string, string> executedScriptsAndDowngradeScripts = GetExecutedScriptsFromDatabase(connectionString);
            var upgradeScripts   = new EmbeddedScriptProvider(Assembly.GetExecutingAssembly(), settings.ScriptsFilter).GetScripts(null);
            var downgradeScripts = new EmbeddedScriptProvider(Assembly.GetExecutingAssembly(), settings.DowngradeScriptsFilter).GetScripts(null);

            Assert.AreEqual(executedScriptsAndDowngradeScripts.Count, upgradeScripts.Count());

            foreach (var storedDowngradeScript in executedScriptsAndDowngradeScripts.Values.Where(v => !string.IsNullOrEmpty(v)))
            {
                Assert.IsTrue(downgradeScripts.Any(script => script.Contents.Equals(storedDowngradeScript)));
            }
        }
Пример #2
0
        static void Main(string[] args)
        {
            string instanceName = @"(local)\SqlExpress";
            // Uncomment the following line to run against sql local db instance.

            var connectionString = $"Data Source={instanceName};Initial Catalog=SampleApplication;Integrated Security=True;Pooling=False";

            //DropDatabase.For.SqlDatabase(connectionString);

            EnsureDatabase.For.SqlDatabase(connectionString);

            DowngradeScriptsSettings settings = DowngradeScriptsSettings.FromSuffix();

            var upgradeEngineBuilder = DeployChanges.To
                                       .SqlDatabase(connectionString)
                                       .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings)
                                       .LogToConsole();

            //var upgradeScriptProvider = new StaticScriptProvider(new List<SqlScript>() { new SqlScript("Values Table", @"CREATE TABLE [dbo].[Values](
            //         [Id] [int] NOT NULL,
            //         [Value1] [int] NOT NULL,
            //         [Value2] [int] NULL,
            //         CONSTRAINT [PK_Values] PRIMARY KEY CLUSTERED
            //        (
            //         [Id] ASC
            //        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
            //        ) ON [PRIMARY]") });

            //var downgradeScriptProvider = new StaticScriptProvider(new List<SqlScript>() { new SqlScript("Values Table", "DROP TABLE [dbo].[Values]") });

            //var upgradeEngineBuilder = DeployChanges.To
            //    .SqlDatabase(connectionString)
            //    .WithScripts(upgradeScriptProvider)
            //    .WithDowngradeTableProvider<SqlDowngradeEnabledTableJournal>(downgradeScriptProvider)
            //    .LogToConsole();

            var upgrader = upgradeEngineBuilder.BuildWithDowngrade(true);

            var result = upgrader.PerformUpgrade();

            // Display the result
            if (result.Successful)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Success!");
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(result.Error);
                Console.WriteLine("Failed!");
            }

            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine();
            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
        }
Пример #3
0
        /// <summary>
        /// Creates EmbeddedDowngradeScriptFinder with DowngradeScriptsSettings.
        /// </summary>
        /// <param name="downgradeScriptsSettings">Pre-builded DowngradeScriptsSettings.</param>
        public EmbeddedDowngradeScriptFinder(DowngradeScriptsSettings downgradeScriptsSettings)
        {
            if (downgradeScriptsSettings == null)
            {
                throw new ArgumentNullException("downgradeScriptsSettings");
            }

            _downgradeScriptsSettings = downgradeScriptsSettings;
        }
Пример #4
0
        public void WithScriptsAndDowngradeScriptsEmbeddedInAssembly_RunsFromSuffix_SuccessfullyRevertIfOlderVersionIsDeployed()
        {
            // Setup
            string suffix = "_downgrade";

            Func <string, bool> scriptsFilter          = s => s.EndsWith(".sql", StringComparison.OrdinalIgnoreCase) && !s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts");
            Func <string, bool> downgradeScriptsFilter = s => s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts");

            DowngradeScriptsSettings settings = new DowngradeScriptsSettings(scriptsFilter, downgradeScriptsFilter,
                                                                             new KeyValuePair <DowngradeScriptsSettingsMode, string>(DowngradeScriptsSettingsMode.Suffix, suffix));

            var upgradeEngineBuilder = DeployChanges.To
                                       .SqlDatabase(connectionString)
                                       .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings)
                                       .LogToNowhere();

            // Act
            var result = upgradeEngineBuilder.BuildWithDowngrade(true).PerformUpgrade();

            //Assert
            Assert.AreEqual(true, result.Successful);

            // Perform revert of latest script
            scriptsFilter = s => s.EndsWith(".sql", StringComparison.OrdinalIgnoreCase) && !s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) &&
                            s.Contains("SuffixUpAndDownScripts") && !s.Contains("Script0004 - Redirects");
            downgradeScriptsFilter = s => s.EndsWith($"{suffix}.sql", StringComparison.OrdinalIgnoreCase) && s.Contains("SuffixUpAndDownScripts");

            settings = new DowngradeScriptsSettings(scriptsFilter, downgradeScriptsFilter,
                                                    new KeyValuePair <DowngradeScriptsSettingsMode, string>(DowngradeScriptsSettingsMode.Suffix, suffix));

            upgradeEngineBuilder = DeployChanges.To
                                   .SqlDatabase(connectionString)
                                   .WithScriptsAndDowngradeScriptsEmbeddedInAssembly <SqlDowngradeEnabledTableJournal>(Assembly.GetExecutingAssembly(), settings)
                                   .LogToNowhere();

            // Act
            result = upgradeEngineBuilder.BuildWithDowngrade(true).PerformUpgrade();

            //Assert
            Assert.AreEqual(true, result.Successful);

            Dictionary <string, string> executedScriptsAndDowngradeScripts = GetExecutedScriptsFromDatabase(connectionString);
            var upgradeScripts = new EmbeddedScriptProvider(Assembly.GetExecutingAssembly(), settings.ScriptsFilter).GetScripts(null);

            Assert.AreEqual(executedScriptsAndDowngradeScripts.Count, upgradeScripts.Count());

            using (var connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand("select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Redirect'", connection);

                try
                {
                    connection.Open();
                    var executeScalar = command.ExecuteScalar();
                    Assert.IsNull(executeScalar); // If null table no longer exists
                }
                catch
                {
                    throw;
                }
                finally
                {
                    connection.Close();
                }
            }
        }