private static void SetupMigrateRunner(Core.MigrationRunner runner) { runner.SetOnMigrationError((ctx) => { output.Info("Migration error!"); Console.WriteLine(ctx.Exception); ctx.Decision = Core.OnMigrationErrorDecision.Stop; }); runner.SetOnCompletingTransaction((ctx) => { ctx.Decision = ctx.HasErrors ? Core.OnCompletingTransactionDecision.Rollback : Core.OnCompletingTransactionDecision.Commit; }); }
private static void SetupDynamicRunner(Core.MigrationRunner runner) { runner.SetOnCompletingTransaction((context) => { output.Info("You are about to complete the migration process. What would you like to do?"); DbMigrator.Core.OnCompletingTransactionDecision?decision = null; while (decision == null) { decision = TryReadEnum <DbMigrator.Core.OnCompletingTransactionDecision>(); } context.Decision = decision.Value; }); runner.SetOnMigrating((context) => { output.Info(string.Format("Current Migration: {0}", context.Migration.Identifier)); DbMigrator.Core.OnMigratingDecision?decision = null; while (decision == null) { decision = TryReadEnum <DbMigrator.Core.OnMigratingDecision>(); } context.Decision = decision.Value; }); runner.SetOnMigrationError((context) => { output.Info(context.Exception.ToString()); output.Info("An error has ocurred. What would you like to do?"); DbMigrator.Core.OnMigrationErrorDecision?decision = null; while (decision == null) { decision = TryReadEnum <DbMigrator.Core.OnMigrationErrorDecision>(); } context.Decision = decision.Value; }); }
private static void Migrate(MigrateOptions opts) { Core.DataAccess.IDataProvider dataProvider = null; switch (opts.Provider.ToLower()) { case "mssql": dataProvider = new Core.DataAccess.MSSqlDataProvider(opts.ConnectionString); break; case "mysql": dataProvider = new Core.DataAccess.MySqlDataProvider(opts.ConnectionString); break; default: throw new ArgumentException("Invalid provider. Only mssql and mysql are currently supported."); } if (string.IsNullOrWhiteSpace(opts.ScriptsRootPath)) { opts.ScriptsRootPath = new FileInfo(opts.ScriptsMapPath).Directory.ToString(); } Core.MigrationRunner runner = new Core.MigrationRunner( dataProvider, new Core.JsonMigrationMapProvider(opts.ScriptsMapPath, opts.ScriptsRootPath), opts.Identifier ); if (opts.Mode != null) { opts.Mode = opts.Mode.ToLowerInvariant().Trim(); } if (opts.Mode == "migrate") { SetupMigrateRunner(runner); } else if (opts.Mode == "test") { SetupTestRunner(runner); } else if (opts.Mode == "interactive") { SetupDynamicRunner(runner); } else { throw new ArgumentException("Invalid migration mode."); } runner.SetOutputHandler(output); runner.AddFilter(new Core.MigrationFilter.RootMigrationFilter(dataProvider, opts.Identifier)); if (!string.IsNullOrWhiteSpace(opts.TrimExpression)) { runner.AddFilter(new Core.MigrationFilter.FlagMigrationFilter(new Core.Util.FlagFilter(opts.TrimExpression))); } if (!string.IsNullOrWhiteSpace(opts.FirstNode)) { runner.AddFilter(new Core.MigrationFilter.FirstNodeMigrationFilter(opts.FirstNode)); } if (!string.IsNullOrWhiteSpace(opts.LastNode)) { runner.AddFilter(new Core.MigrationFilter.LastNodeMigrationFilter(opts.LastNode)); } runner.Migrate(); }