public void Updates_database() { var settings = new ConnectionSettings("server", "db", true, null, null); var taskAttributes = new TaskAttributes(settings, "c:\\scripts"); taskAttributes.RequestedDatabaseAction = RequestedDatabaseAction.Update; var mocks = new MockRepository(); var scriptfolderexecutor = mocks.StrictMock<IScriptFolderExecutor>(); var queryexecutor = mocks.StrictMock<IQueryExecutor>(); queryexecutor.Stub(x => x.CheckDatabaseExists(taskAttributes.ConnectionSettings)).Return(true); var taskObserver = mocks.StrictMock<ITaskObserver>(); using (mocks.Record()) { taskObserver.Log(string.Format("Run scripts in Update folder.")); scriptfolderexecutor.ExecuteScriptsInFolder(taskAttributes, "Update", taskObserver); taskObserver.Log(string.Format("Run scripts in Everytime folder.")); scriptfolderexecutor.ExecuteChangedScriptsInFolder(taskAttributes, "Everytime", taskObserver); taskObserver.Log(string.Format("Run scripts in RunAlways folder.")); scriptfolderexecutor.ExecuteRunAlwaysScriptsInFolder(taskAttributes, "RunAlways", taskObserver); } using (mocks.Playback()) { IDatabaseActionExecutor updater = new DatabaseUpdater(scriptfolderexecutor, queryexecutor); updater.Execute(taskAttributes, taskObserver); } mocks.VerifyAll(); }
public void Execute(TaskAttributes taskAttributes, ITaskObserver taskObserver) { try { var version = _queryExecutor.ReadFirstColumnAsStringArray(taskAttributes.ConnectionSettings, "select @@version")[0]; taskObserver.Log("Running against: " + version); //can't kill connections or enter single user mode in Azure var sql = string.Format("drop database [{0}]", taskAttributes.ConnectionSettings.Database); if (!version.Contains("SQL Azure")) { _connectionDropper.Drop(taskAttributes.ConnectionSettings, taskObserver); sql = string.Format("ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE drop database [{0}]", taskAttributes.ConnectionSettings.Database); } string message = string.Format("Dropping database: {0}\n", taskAttributes.ConnectionSettings.Database); taskObserver.Log(message); _queryExecutor.ExecuteNonQuery(taskAttributes.ConnectionSettings, sql); } catch (Exception) { //if the database doesn't exist just close any open connections and move on SqlConnection.ClearAllPools(); taskObserver.Log(string.Format("Database '{0}' could not be dropped.", taskAttributes.ConnectionSettings.Database)); } }
public void Executes_all_the_scripts_within_a_folder() { var settings = new ConnectionSettings("server", "db", true, null, null); var sqlFiles = new[] { "c:\\scripts\\Update\\001.sql", "c:\\scripts\\Update\\002_data_.sql", "c:\\scripts\\Update\\003.sql" }; var taskAttributes = new TaskAttributes(settings, "c:\\scripts") { RequestedDatabaseAction = RequestedDatabaseAction.Update, }; var mocks = new MockRepository(); var initializer = mocks.StrictMock<ISchemaInitializer>(); var fileLocator = mocks.StrictMock<ISqlFileLocator>(); var executor = mocks.StrictMock<IChangeScriptExecutor>(); var testdataexecutor = mocks.StrictMock<ITestDataScriptExecutor>(); var versioner = mocks.StrictMock<IDatabaseVersioner>(); var taskObserver = mocks.StrictMock<ITaskObserver>(); using (mocks.Record()) { initializer.EnsureSchemaCreated(settings); Expect.Call(fileLocator.GetSqlFilenames("c:\\scripts", "Update")).Return(sqlFiles); executor.Execute("c:\\scripts\\Update\\001.sql", settings, taskObserver); executor.Execute("c:\\scripts\\Update\\002_data_.sql", settings, taskObserver); executor.Execute("c:\\scripts\\Update\\003.sql", settings, taskObserver); versioner.VersionDatabase(settings, taskObserver); } using (mocks.Playback()) { IScriptFolderExecutor folderExecutor = new ScriptFolderExecutor(initializer, fileLocator, executor, testdataexecutor, versioner); folderExecutor.ExecuteScriptsInFolder(taskAttributes, "Update", taskObserver); } mocks.VerifyAll(); }
public void Should_not_fail_if_datebase_does_not_exist() { var settings = new ConnectionSettings("server", "db", true, null, null); var taskAttributes = new TaskAttributes(settings, null); var mocks = new MockRepository(); var connectionDropper = mocks.DynamicMock<IDatabaseConnectionDropper>(); var taskObserver = mocks.StrictMock<ITaskObserver>(); var queryExecutor = mocks.StrictMock<IQueryExecutor>(); using (mocks.Record()) { Expect.Call(() => taskObserver.Log("Running against: SQL Server")); Expect.Call(queryExecutor.ReadFirstColumnAsStringArray(settings, "select @@version")).Return(new string[] { "SQL Server" }); Expect.Call(() => taskObserver.Log("Dropping database: db\n")); Expect.Call(() => queryExecutor.ExecuteNonQuery(settings, "ALTER DATABASE [db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE drop database [db]")) .Throw(new Exception("foo message")); Expect.Call(() => taskObserver.Log("Database 'db' could not be dropped.")); } using (mocks.Playback()) { IDatabaseActionExecutor dropper = new DatabaseDropper(connectionDropper, queryExecutor); dropper.Execute(taskAttributes, taskObserver); } mocks.VerifyAll(); }
public void Manages_database() { var settings = new ConnectionSettings("server", "db", true, null, null); var scriptDirectory = @"c:\scripts"; var taskAttributes = new TaskAttributes(settings, scriptDirectory); taskAttributes.RequestedDatabaseAction= RequestedDatabaseAction.Create; var mocks = new MockRepository(); var taskObserver = mocks.StrictMock<ITaskObserver>(); var generator = mocks.StrictMock<ILogMessageGenerator>(); var factory = mocks.StrictMock<IDatabaseActionExecutorFactory>(); var creator = mocks.StrictMock<IDatabaseActionExecutor>(); var updater = mocks.StrictMock<IDatabaseActionExecutor>(); var executors = new IDatabaseActionExecutor[] { creator, updater }; using (mocks.Record()) { Expect.Call(generator.GetInitialMessage(taskAttributes)).Return("starting..."); taskObserver.Log("starting..."); Expect.Call(factory.GetExecutors(RequestedDatabaseAction.Create)).Return(executors); creator.Execute(taskAttributes, taskObserver); updater.Execute(taskAttributes, taskObserver); } using (mocks.Playback()) { ISqlDatabaseManager manager = new SqlDatabaseManager(generator, factory); manager.Upgrade(taskAttributes, taskObserver); } mocks.VerifyAll(); }
public void Creates_database() { var settings = new ConnectionSettings("server", "db", true, null, null); var taskAttributes = new TaskAttributes(settings, "c:\\scripts"); taskAttributes.RequestedDatabaseAction= RequestedDatabaseAction.Create; var mocks = new MockRepository(); var queryExecutor = mocks.StrictMock<IQueryExecutor>(); var executor = mocks.StrictMock<IScriptFolderExecutor>(); var taskObserver = mocks.StrictMock<ITaskObserver>(); using (mocks.Record()) { queryExecutor.ExecuteNonQuery(settings, "create database [db]"); taskObserver.Log(string.Format("Run scripts in Create folder.")); executor.ExecuteScriptsInFolder(taskAttributes, "Create", taskObserver); } using (mocks.Playback()) { IDatabaseActionExecutor creator = new DatabaseCreator(queryExecutor, executor); creator.Execute(taskAttributes, taskObserver); } mocks.VerifyAll(); }
public void Drops_Azure_database_without_dropping_connections() { var settings = new ConnectionSettings("server", "db", true, null, null); var taskAttributes = new TaskAttributes(settings, null); var mocks = new MockRepository(); var connectionDropper = mocks.StrictMock<IDatabaseConnectionDropper>(); var taskObserver = mocks.StrictMock<ITaskObserver>(); var queryExecutor = mocks.StrictMock<IQueryExecutor>(); using (mocks.Record()) { Expect.Call(() => taskObserver.Log("Running against: SQL Azure")); Expect.Call(queryExecutor.ReadFirstColumnAsStringArray(settings, "select @@version")).Return(new string[] { "SQL Azure" }); queryExecutor.ExecuteNonQuery(settings, "drop database [db]"); Expect.Call(() => taskObserver.Log("Dropping database: db\n")); } using (mocks.Playback()) { IDatabaseActionExecutor dropper = new DatabaseDropper(connectionDropper, queryExecutor); dropper.Execute(taskAttributes, taskObserver); } mocks.VerifyAll(); }
public void Execute(TaskAttributes taskAttributes, ITaskObserver taskObserver) { string sql = string.Format("create database [{0}]", taskAttributes.ConnectionSettings.Database); _queryExecutor.ExecuteNonQuery(taskAttributes.ConnectionSettings, sql); taskObserver.Log(string.Format("Run scripts in Create folder.")); _folderExecutor.ExecuteScriptsInFolder(taskAttributes, "Create", taskObserver); }
public string GetInitialMessage(TaskAttributes taskAttributes) { var scriptFolder = taskAttributes.RequestedDatabaseAction != RequestedDatabaseAction.Drop ? string.Format(" using scripts from {0}", taskAttributes.ScriptDirectory) : string.Empty; var logMessage = string.Format("{0} {1} on {2}{3}\n", taskAttributes.RequestedDatabaseAction,taskAttributes.ConnectionSettings.Database, taskAttributes.ConnectionSettings.Server, scriptFolder); return logMessage; }
public void Creates_initial_log_message_for_database_drop() { ILogMessageGenerator generator = new LogMessageGenerator(); var settings = new ConnectionSettings("server", "db", true, null, null); var taskAttributes = new TaskAttributes(settings, "c:\\scripts") {RequestedDatabaseAction = RequestedDatabaseAction.Drop}; string message = generator.GetInitialMessage(taskAttributes); Assert.That(message, Is.EqualTo("Drop db on server\n")); }
public void ExecuteTestDataScriptsInFolder(TaskAttributes taskAttributes, string scriptDirectory, ITaskObserver taskObserver) { _schemaInitializer.EnsureTestDataSchemaCreated(taskAttributes.ConnectionSettings); var sqlFilenames = _fileLocator.GetSqlFilenames(taskAttributes.ScriptDirectory, scriptDirectory); foreach (string sqlFilename in sqlFilenames) { _testDataScriptExecutor.Execute(sqlFilename, taskAttributes.ConnectionSettings, taskObserver); } }
public void ExecuteRunAlwaysScriptsInFolder(TaskAttributes taskAttributes, string scriptDirectory, ITaskObserver taskObserver) { var sqlFilenames = _fileLocator.GetSqlFilenames(taskAttributes.ScriptDirectory, scriptDirectory); foreach (string sqlFilename in sqlFilenames) { _scriptExecutor.ExecuteAlways(sqlFilename, taskAttributes.ConnectionSettings, taskObserver, taskAttributes.LogOnly); } _versioner.VersionDatabase(taskAttributes.ConnectionSettings, taskObserver); }
public void Upgrade(TaskAttributes taskAttributes, ITaskObserver taskObserver) { string initializationMessage = _logMessageGenerator.GetInitialMessage(taskAttributes); taskObserver.Log(initializationMessage); IEnumerable<IDatabaseActionExecutor> executors = _actionExecutorFactory.GetExecutors(taskAttributes.RequestedDatabaseAction); foreach (IDatabaseActionExecutor executor in executors) { executor.Execute(taskAttributes, taskObserver); } }
/// <summary> /// <para>Runs AliaSQL against a database</para> /// <para>Default action is Update but it can be set to other AliaSQL actions</para> /// <para>Default script directory is ~/App_Data/scripts/ but it can bet set to any physical path</para> /// <para>-If database does not exist it will be created</para> /// <para>-Script directory path must exist</para> /// <para>Returns an object with a success boolean and a result string</para> /// </summary> /// <param name="connectionString"></param> /// <param name="action"></param> /// <param name="scriptDirectory"></param> /// <returns>Returns an object with a success boolean and a result string</returns> public AliaSqlResult UpdateDatabase(string connectionString, RequestedDatabaseAction action = RequestedDatabaseAction.Update, string scriptDirectory = "") { if (scriptDirectory == "") { scriptDirectory = Path.Combine(AppDomain.CurrentDomain.GetData("DataDirectory").ToString(), "scripts"); } if (!Directory.Exists(scriptDirectory)) { throw new ArgumentException("There are no scripts in the defined data directory."); } if (action == RequestedDatabaseAction.Update && !PendingChanges(connectionString, scriptDirectory).Any()) { return new AliaSqlResult { Result = "No pending changes", Success = true }; } var result = new AliaSqlResult { Success = true }; var manager = new SqlDatabaseManager(); var taskAttributes = new TaskAttributes(_connectionStringGenerator.GetConnectionSettings(connectionString), scriptDirectory) { RequestedDatabaseAction = action, }; try { manager.Upgrade(taskAttributes, this); foreach (var property in _properties) { Log(property.Key + ": " + property.Value); } result.Result = sb.ToString(); } catch (Exception exception) { result.Success = false; var ex = exception; do { Log("Failure: " + ex.Message); if (ex.Data["Custom"] != null) Log(ex.Data["Custom"].ToString()); ex = ex.InnerException; } while (ex != null); } result.Result = sb.ToString(); return result; }
public void Execute(TaskAttributes taskAttributes, ITaskObserver taskObserver) { if (!_queryExecutor.CheckDatabaseExists(taskAttributes.ConnectionSettings)) { taskObserver.Log(string.Format("Database does not exist. Attempting to create database before updating.")); string sql = string.Format("create database [{0}]", taskAttributes.ConnectionSettings.Database); _queryExecutor.ExecuteNonQuery(taskAttributes.ConnectionSettings, sql); taskObserver.Log(string.Format("Run scripts in Create folder.")); _folderExecutor.ExecuteScriptsInFolder(taskAttributes, "Create", taskObserver); } taskObserver.Log(string.Format("Run scripts in Update folder.")); _folderExecutor.ExecuteScriptsInFolder(taskAttributes, "Update", taskObserver); taskObserver.Log(string.Format("Run scripts in Everytime folder.")); _folderExecutor.ExecuteChangedScriptsInFolder(taskAttributes, "Everytime", taskObserver); }
public void LogsTestData() { var settings = new ConnectionSettings("server", "db", true, null, null); var taskAttributes = new TaskAttributes(settings, "c:\\scripts"); taskAttributes.RequestedDatabaseAction = RequestedDatabaseAction.TestData; var mocks = new MockRepository(); var queryExecutor = mocks.StrictMock<IQueryExecutor>(); var executor = mocks.StrictMock<IScriptFolderExecutor>(); var taskObserver = mocks.StrictMock<ITaskObserver>(); using (mocks.Record()) { executor.ExecuteTestDataScriptsInFolder(taskAttributes, "TestData", taskObserver); } using (mocks.Playback()) { IDatabaseActionExecutor testdata = new DatabaseTestData(executor); testdata.Execute(taskAttributes, taskObserver); } mocks.VerifyAll(); }
public bool UpdateDatabase(ConnectionSettings settings, string scriptDirectory, RequestedDatabaseAction action) { var manager = new SqlDatabaseManager(); var taskAttributes = new TaskAttributes(settings, scriptDirectory) { RequestedDatabaseAction = action, }; try { manager.Upgrade(taskAttributes, this); foreach (var property in _properties) { Log(property.Key +": " + property.Value); } return true; } catch (Exception exception) { var ex = exception; do { Log("Failure: " + ex.Message); if (ex.Data["Custom"] != null) Log(ex.Data["Custom"].ToString()); ex = ex.InnerException; } while (ex != null); } if (Debugger.IsAttached) System.Console.ReadLine(); return false; }
public void Execute(TaskAttributes taskAttributes, ITaskObserver taskObserver) { taskAttributes.LogOnly = true; _folderExecutor.ExecuteScriptsInFolder(taskAttributes, "Create", taskObserver); _folderExecutor.ExecuteScriptsInFolder(taskAttributes, "Update", taskObserver); }
public void Execute(TaskAttributes taskAttributes, ITaskObserver taskObserver) { _folderExecutor.ExecuteTestDataScriptsInFolder(taskAttributes, "TestData", taskObserver); }