internal void Execute(IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { Debug.Assert(connection.State == ConnectionState.Open); var context = new RuntimeContext(connection, transaction, commandExecutor, _providerMetadata); Database database = GetDatabaseContainingMigrationChanges(direction, context); var translator = new CommandsToSqlTranslator(_provider); foreach (string commandText in translator.TranslateToSql(database, context)) { //MigSharp uses ADO, not SMO to run SQL. ADO does not support the 'GO' statement in SQL as it is not TSQL. //We split SQL on 'GO' and run as individual statements var separatedByGoStatements = new List<string>(goStatementRegex.Split(commandText)); separatedByGoStatements.RemoveAll(r => String.IsNullOrEmpty(r.Trim())); foreach (var statement in separatedByGoStatements) { IDbCommand command = connection.CreateCommand(); command.CommandTimeout = 0; // do not timeout; the client is responsible for not causing lock-outs command.Transaction = transaction; command.CommandText = statement; try { commandExecutor.ExecuteNonQuery(command); } catch (DbException x) { Log.Error("An error occurred: {0}{1}while trying to execute:{1}{2}", x.Message, Environment.NewLine, command.CommandText); throw; } } } }
private static void AssertAreEqual(IProvider sqlProvider, IProvider smoProvider, Database database) { MigrationReport report = MigrationReport.Create(database, string.Empty); Assert.IsEmpty(report.Error); var sqlTranslator = new CommandsToSqlTranslator(sqlProvider); var smoTranslator = new CommandsToSqlTranslator(smoProvider); var context = MockRepository.GenerateStub<IRuntimeContext>(); ScriptComparer.AssertAreEqual(smoTranslator.TranslateToSql(database, context), sqlTranslator.TranslateToSql(database, context)); }
public static MigrationReport Create(Database database, string migrationName) { // execute changes in 'database' against a RecordingProvider var recordingProvider = new RecordingProvider(); var translator = new CommandsToSqlTranslator(recordingProvider); string error = string.Empty; try { translator.TranslateToSql(database, null).ToList(); // .ToList() is important to effectively trigger the iteration } catch (InvalidCommandException x) { error = x.Message; } // create MigrationReport return new MigrationReport(migrationName, error, recordingProvider); }
public void TestProviderArgumentsAreCorrect(Action<IDatabase> arrangeDatabase, Action<IProvider, IFakeScope> assertProvider) { // arrange var provider = A.Fake<IProvider>(); CommandsToSqlTranslator translator = new CommandsToSqlTranslator(provider); var context = A.Fake<IRuntimeContext>(); var database = new Database(context); arrangeDatabase(database); // act using (IFakeScope scope = Fake.CreateScope()) { // ReSharper disable ReturnValueOfPureMethodIsNotUsed translator.TranslateToSql(database, context).ToList(); // ReSharper restore ReturnValueOfPureMethodIsNotUsed // assert assertProvider(provider, scope); } }
public static MigrationReport Create(Database database, string migrationName, IMigrationContext context) { // execute changes in 'database' against a RecordingProvider var recordingProvider = new RecordingProvider(); var translator = new CommandsToSqlTranslator(recordingProvider); string error = string.Empty; try { // ReSharper disable ReturnValueOfPureMethodIsNotUsed translator.TranslateToSql(database, context).ToList(); // .ToList() is important to effectively trigger the iteration // ReSharper restore ReturnValueOfPureMethodIsNotUsed } catch (InvalidCommandException x) { error = x.Message; } // create MigrationReport return new MigrationReport(migrationName, error, recordingProvider); }
internal void Execute(IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { Debug.Assert(connection.State == ConnectionState.Open); var context = new RuntimeContext(connection, transaction, commandExecutor, _providerMetadata); Database database = GetDatabaseContainingMigrationChanges(direction, context); var translator = new CommandsToSqlTranslator(_provider); foreach (string commandText in translator.TranslateToSql(database, context)) { IDbCommand command = connection.CreateCommand(); command.CommandTimeout = 0; // do not timeout; the client is responsible for not causing lock-outs command.Transaction = transaction; command.CommandText = commandText; try { commandExecutor.ExecuteNonQuery(command); } catch (DbException x) { Log.Error("An error occurred: {0}{1}while trying to execute:{1}{2}{1}{3}", x.Message, Environment.NewLine, command.CommandText,_migration.GetType().ToString()); throw new Exception(String.Format("An error occurred: {0}{1}while trying to execute:{1}{2}{1}Migration: {3}", x.Message, Environment.NewLine, command.CommandText, _migration.GetType())); } } }