private void RunIntegratedTestAndConfirmOutputResults(string syntaxName, DirectoryInfo templateDirectory) { StringWriter writer = new StringWriter(); ChangeScript changeOne = new StubChangeScript(1, "001_change.sql", "-- contents of change script 1"); ChangeScript changeTwo = new StubChangeScript(2, "002_change.sql", "-- contents of change script 2"); List <ChangeScript> changeScripts = new List <ChangeScript> { changeOne, changeTwo }; ChangeScriptRepository changeScriptRepository = new ChangeScriptRepository(changeScripts); var factory = new DbmsFactory(syntaxName, string.Empty); StubSchemaManager schemaManager = new StubSchemaManager(factory.CreateDbmsSyntax()); IChangeScriptApplier applier = new TemplateBasedApplier(writer, syntaxName, "ChangeLog", ";", new NormalDelimiter(), templateDirectory); Controller controller = new Controller(changeScriptRepository, schemaManager, applier, null, System.Console.Out); controller.ProcessChangeScripts(null); var actual = writer.ToString(); try { Assert.AreEqual(this.ReadExpectedFileContents(this.GetExpectedFilename(syntaxName)), actual); } catch (Exception) { // Output actual template on failure. Console.WriteLine("\n\nActual Template ({0}):", syntaxName); Console.WriteLine(actual); throw; } }
public void TestDoesNotRunSecondScriptIfFirstScriptFails() { this.EnsureTableDoesNotExist("TableWeWillUse"); this.EnsureTableDoesNotExist(TableName); var factory = new DbmsFactory(this.Dbms, this.ConnectionString); var dbmsSyntax = factory.CreateDbmsSyntax(); var output = new StringBuilder(); var applier = new TemplateBasedApplier( new StringWriter(output), dbmsSyntax, TableName, ";", DbDeployDefaults.DelimiterType, DbDeployDefaults.TemplateDirectory); applier.Apply(new ChangeScript[] { new StubChangeScript(1, "1.test.sql", "INSERT INTO TableWeWillUse VALUES (1);"), new StubChangeScript(2, "2.test.sql", "CREATE TABLE dbo.TableWeWillUse (Id int NULL);"), }, createChangeLogTable: true); using (var sqlExecuter = new SqlCmdExecutor(this.ConnectionString)) { var cmdOutput = new StringBuilder(); sqlExecuter.ExecuteString(output.ToString(), cmdOutput); } this.AssertTableDoesNotExist("TableWeWillUse"); }
public void TestDoesNotRunSecondScriptIfFirstScriptFails() { EnsureTableDoesNotExist("TableWeWillUse"); EnsureTableDoesNotExist(TableName); var factory = new DbmsFactory(Dbms, ConnectionString); var dbmsSyntax = factory.CreateDbmsSyntax(); var output = new StringBuilder(); var applier = new TemplateBasedApplier( new StringWriter(output), dbmsSyntax, TableName, ";", DbDeployDefaults.DelimiterType, DbDeployDefaults.TemplateDirectory); applier.Apply(new ChangeScript[] { new StubChangeScript(1, "1.test.sql", "INSERT INTO TableWeWillUse VALUES (1);"), new StubChangeScript(2, "2.test.sql", "CREATE TABLE dbo.TableWeWillUse (Id int NULL);"), }, true); using (var sqlExecuter = new SqlCmdExecutor(ConnectionString)) { var cmdOutput = new StringBuilder(); sqlExecuter.ExecuteString(output.ToString(), cmdOutput); } AssertTableDoesNotExist("TableWeWillUse"); }
private void RunIntegratedTestAndConfirmOutputResults(string syntaxName, DirectoryInfo templateDirectory) { var writer = new StringWriter(); var listReplaces = new List<string>() { "$script.Guid", "$script.Folder", "$script.ScriptNumber", "$script.ScriptName" }; var listExpecteds = new List<string>() { "START CHANGE SCRIPT v1.0/001_change.sql", "END CHANGE SCRIPT v1.0/001_change.sql", "START CHANGE SCRIPT v1.0/002_change.sql", "END CHANGE SCRIPT v1.0/002_change.sql", "INSERT INTO ChangeLog (ChangeId, Folder, ScriptNumber, ScriptName, StartDate, AppliedBy, ScriptStatus, ScriptOutput)", "UPDATE ChangeLog" }; ChangeScript changeOne = new StubChangeScript(1, "001_change.sql", "-- contents of change script 1"); ChangeScript changeTwo = new StubChangeScript(2, "002_change.sql", "-- contents of change script 2"); var changeScripts = new List<ChangeScript> { changeOne, changeTwo }; var changeScriptRepository = new ChangeScriptRepository(changeScripts); var factory = new DbmsFactory(syntaxName, string.Empty); var dbmsSyntax = factory.CreateDbmsSyntax(); const bool createChangeLogTable = false; var schemaManager = new StubSchemaManager(dbmsSyntax, createChangeLogTable); IChangeScriptApplier applier = new TemplateBasedApplier(writer, dbmsSyntax, "ChangeLog", ";", new NormalDelimiter(), templateDirectory); var controller = new Controller(new RepositorioScripts(schemaManager,changeScriptRepository), schemaManager, applier, null, createChangeLogTable, Console.Out); controller.ProcessChangeScripts(null); var actual = writer.ToString(); try { var expected = ReadExpectedFileContents(GetExpectedFilename(syntaxName)); foreach (var currentExpected in listExpecteds) { expected.Should().Contain(currentExpected, string.Format("The expected script does not contain {0}", currentExpected)); } foreach (var replace in listReplaces) { if (actual.Contains(replace)) Assert.Fail("A regex from template does not were replaced. \n\rRegex: {0} ", replace); } } catch (Exception) { // Output actual template on failure. Console.WriteLine("\n\nActual Template ({0}):", syntaxName); Console.WriteLine(actual); throw; } }
/// <summary> /// Executes the a database deployment with the specified config. /// </summary> /// <param name="config">The config.</param> /// <param name="infoWriter">The info writer.</param> /// <exception cref="System.InvalidOperationException">SQLCMD mode can only be applied against an mssql database.</exception> public void Execute(DbDeployConfig config, TextWriter infoWriter) { this.Validate(config, infoWriter); infoWriter.WriteLine(); infoWriter.WriteLine("=========================================================="); infoWriter.WriteLine(this.GenerateWelcomeString()); var factory = new DbmsFactory(config.Dbms, config.ConnectionString); var dbmsSyntax = factory.CreateDbmsSyntax(); var queryExecuter = new QueryExecuter(factory); var databaseSchemaVersionManager = new DatabaseSchemaVersionManager(queryExecuter, dbmsSyntax, config.ChangeLogTableName, config.AutoCreateChangeLogTable); var scanner = new DirectoryScanner(infoWriter, config.Encoding); var changeScriptRepository = new ChangeScriptRepository(scanner.GetChangeScriptsForDirectory(config.ScriptDirectory)); IChangeScriptApplier doScriptApplier; TextWriter doWriter = null; QueryExecuter applierExecutor = null; if (config.OutputFile != null) { doWriter = new StreamWriter(config.OutputFile.OpenWrite(), config.Encoding); doScriptApplier = new TemplateBasedApplier( doWriter, config.Dbms, config.ChangeLogTableName, config.Delimiter, config.DelimiterType, config.TemplateDirectory); } else if (config.UseSqlCmd) { // Verify database is MSSQL. if (!string.Equals(config.Dbms, "mssql", StringComparison.InvariantCultureIgnoreCase)) { throw new InvalidOperationException("SQLCMD mode can only be applied against an mssql database."); } doScriptApplier = new SqlCmdApplier(config.ConnectionString, databaseSchemaVersionManager, infoWriter); } else { var splitter = new QueryStatementSplitter { Delimiter = config.Delimiter, DelimiterType = config.DelimiterType, LineEnding = config.LineEnding, }; // Do not share query executor between schema manager and applier, since a failure in one will effect the other. applierExecutor = new QueryExecuter(factory); doScriptApplier = new DirectToDbApplier( applierExecutor, databaseSchemaVersionManager, splitter, infoWriter); } IChangeScriptApplier undoScriptApplier = null; TextWriter undoWriter = null; if (config.UndoOutputFile != null) { undoWriter = new StreamWriter(config.UndoOutputFile.OpenWrite(), config.Encoding); undoScriptApplier = new UndoTemplateBasedApplier( undoWriter, config.Dbms, config.ChangeLogTableName, config.Delimiter, config.DelimiterType, config.TemplateDirectory); } try { var controller = new Controller( changeScriptRepository, databaseSchemaVersionManager, doScriptApplier, undoScriptApplier, infoWriter); controller.ProcessChangeScripts(config.LastChangeToApply, config.ForceUpdate); queryExecuter.Close(); if (applierExecutor != null) { applierExecutor.Close(); } } finally { if (doWriter != null) { doWriter.Dispose(); } if (undoWriter != null) { undoWriter.Dispose(); } } }
public void Go() { this.Validate(); this.InfoWriter.WriteLine(this.GenerateWelcomeString()); var factory = new DbmsFactory(this.Dbms, this.ConnectionString); var dbmsSyntax = factory.CreateDbmsSyntax(); QueryExecuter queryExecuter = new QueryExecuter(factory); var databaseSchemaVersionManager = new DatabaseSchemaVersionManager(queryExecuter, dbmsSyntax, this.ChangeLogTableName); var scanner = new DirectoryScanner(this.InfoWriter, this.Encoding); var changeScriptRepository = new ChangeScriptRepository(scanner.GetChangeScriptsForDirectory(this.ScriptDirectory)); IChangeScriptApplier doScriptApplier; TextWriter doWriter = null; if (this.OutputFile != null) { doWriter = new StreamWriter(this.OutputFile.OpenWrite(), this.Encoding); doScriptApplier = new TemplateBasedApplier( doWriter, this.Dbms, this.ChangeLogTableName, this.Delimiter, this.DelimiterType, this.TemplateDir); } else { QueryStatementSplitter splitter = new QueryStatementSplitter { Delimiter = this.Delimiter, DelimiterType = this.DelimiterType, LineEnding = this.LineEnding, }; doScriptApplier = new DirectToDbApplier( queryExecuter, databaseSchemaVersionManager, splitter, this.InfoWriter); } IChangeScriptApplier undoScriptApplier = null; TextWriter undoWriter = null; if (this.UndoOutputFile != null) { undoWriter = new StreamWriter(this.UndoOutputFile.OpenWrite(), this.Encoding); undoScriptApplier = new UndoTemplateBasedApplier( undoWriter, this.Dbms, this.ChangeLogTableName, this.Delimiter, this.DelimiterType, this.TemplateDir); } try { Controller controller = new Controller( changeScriptRepository, databaseSchemaVersionManager, doScriptApplier, undoScriptApplier, this.InfoWriter); controller.ProcessChangeScripts(this.LastChangeToApply); queryExecuter.Close(); } finally { if (doWriter != null) { doWriter.Dispose(); } if (undoWriter != null) { undoWriter.Dispose(); } } }
private void RunIntegratedTestAndConfirmOutputResults(string syntaxName, DirectoryInfo templateDirectory) { var writer = new StringWriter(); var listReplaces = new List <string>() { "$script.Guid", "$script.Folder", "$script.ScriptNumber", "$script.ScriptName" }; var listExpecteds = new List <string>() { "START CHANGE SCRIPT v1.0/001_change.sql", "END CHANGE SCRIPT v1.0/001_change.sql", "START CHANGE SCRIPT v1.0/002_change.sql", "END CHANGE SCRIPT v1.0/002_change.sql", "INSERT INTO ChangeLog (ChangeId, Folder, ScriptNumber, ScriptName, StartDate, AppliedBy, ScriptStatus, ScriptOutput)", "UPDATE ChangeLog" }; ChangeScript changeOne = new StubChangeScript(1, "001_change.sql", "-- contents of change script 1"); ChangeScript changeTwo = new StubChangeScript(2, "002_change.sql", "-- contents of change script 2"); var changeScripts = new List <ChangeScript> { changeOne, changeTwo }; var changeScriptRepository = new ChangeScriptRepository(changeScripts); var factory = new DbmsFactory(syntaxName, string.Empty); var dbmsSyntax = factory.CreateDbmsSyntax(); const bool createChangeLogTable = false; var schemaManager = new StubSchemaManager(dbmsSyntax, createChangeLogTable); IChangeScriptApplier applier = new TemplateBasedApplier(writer, dbmsSyntax, "ChangeLog", ";", new NormalDelimiter(), templateDirectory); var controller = new Controller(new RepositorioScripts(schemaManager, changeScriptRepository), schemaManager, applier, null, createChangeLogTable, Console.Out); controller.ProcessChangeScripts(null); var actual = writer.ToString(); try { var expected = ReadExpectedFileContents(GetExpectedFilename(syntaxName)); foreach (var currentExpected in listExpecteds) { expected.Should().Contain(currentExpected, string.Format("The expected script does not contain {0}", currentExpected)); } foreach (var replace in listReplaces) { if (actual.Contains(replace)) { Assert.Fail("A regex from template does not were replaced. \n\rRegex: {0} ", replace); } } } catch (Exception) { // Output actual template on failure. Console.WriteLine("\n\nActual Template ({0}):", syntaxName); Console.WriteLine(actual); throw; } }
/// <summary> /// Executes the a database deployment with the specified config. /// </summary> /// <param name="config">The config.</param> /// <param name="infoWriter">The info writer.</param> /// <exception cref="System.InvalidOperationException">SQLCMD mode can only be applied against an mssql database.</exception> public void Execute(DbDeployConfig config, TextWriter infoWriter) { this.Validate(config, infoWriter); infoWriter.WriteLine(); infoWriter.WriteLine("=========================================================="); infoWriter.WriteLine(this.GenerateWelcomeString()); var factory = new DbmsFactory(config.Dbms, config.ConnectionString, config.DllPathConnector); var dbmsSyntax = factory.CreateDbmsSyntax(); var queryExecuter = new QueryExecuter(factory); var databaseSchemaVersionManager = new DatabaseSchemaVersionManager(queryExecuter, dbmsSyntax, config.ChangeLogTableName); IChangeScriptApplier doScriptApplier; TextWriter doWriter = null; QueryExecuter applierExecutor = null; if (config.OutputFile != null) { doWriter = new StreamWriter(config.OutputFile.OpenWrite(), config.Encoding); doScriptApplier = new TemplateBasedApplier( doWriter, dbmsSyntax, config.ChangeLogTableName, config.Delimiter, config.DelimiterType, config.TemplateDirectory); } else if (config.UseSqlCmd) { // Verify database is MSSQL. if (!string.Equals(config.Dbms, SupportedDbms.MSSQL, StringComparison.InvariantCultureIgnoreCase)) { throw new InvalidOperationException("SQLCMD mode can only be applied against an mssql database."); } doScriptApplier = new SqlCmdApplier( config.ConnectionString, databaseSchemaVersionManager, dbmsSyntax, config.ChangeLogTableName, infoWriter); } else { var splitter = new QueryStatementSplitter { Delimiter = config.Delimiter, DelimiterType = config.DelimiterType, LineEnding = config.LineEnding, }; // Do not share query executor between schema manager and applier, since a failure in one will effect the other. applierExecutor = new QueryExecuter(factory); doScriptApplier = new DirectToDbApplier( applierExecutor, databaseSchemaVersionManager, splitter, dbmsSyntax, config.ChangeLogTableName, infoWriter); } IChangeScriptApplier undoScriptApplier = null; TextWriter undoWriter = null; if (config.UndoOutputFile != null) { undoWriter = new StreamWriter(config.UndoOutputFile.OpenWrite(), config.Encoding); undoScriptApplier = new UndoTemplateBasedApplier( undoWriter, dbmsSyntax, config.ChangeLogTableName, config.Delimiter, config.DelimiterType, config.TemplateDirectory); } try { var changeScriptRepositoryFactory = new ChangeScriptRepositoryFactory(config, infoWriter); var changeScriptRepository = changeScriptRepositoryFactory.Obter(); var repositorioScripts = new RepositorioScripts(databaseSchemaVersionManager, changeScriptRepository); var controller = new Controller( repositorioScripts, databaseSchemaVersionManager, doScriptApplier, undoScriptApplier, config.AutoCreateChangeLogTable, infoWriter); controller.ProcessChangeScripts(config.LastChangeToApply, config.ForceUpdate); queryExecuter.Close(); if (applierExecutor != null) { applierExecutor.Close(); } } finally { if (doWriter != null) { doWriter.Dispose(); } if (undoWriter != null) { undoWriter.Dispose(); } } }