public bool LoadMigrations() { var logger = LogManager.GetLogger("Migrator"); var migrationFiles = Directory.GetFiles(MigrationsScriptFilePath, "*.json"); MigrationsList.Clear(); foreach (string migrationsFile in migrationFiles) { try { var migration = JsonConvert.DeserializeObject <Migrations>( File.ReadAllText(migrationsFile)); if (MigrationsConfig.SysDbVersion.CompareTo(migration.SysVersion) == -1) { MigrationsList.Add(migration); logger.Info($"{Path.GetFileName(migrationsFile)} ({migration.Description}) loaded."); } } catch (Exception e) { logger.Error($"Loading {Path.GetFileName(migrationsFile)} - {e.Message} ({e.StackTrace})"); return(false); } } return(true); }
public bool ExecuteMigrations() { var migrationsToUse = MigrationsList.OrderBy(x => x.SysVersion).ToList(); var migLogger = LogManager.GetLogger("Migrator"); if (!MigrationsList.Any()) { migLogger.Info($"No migrations to execute. Current database version is {MigrationsConfig.DbVersion}."); return(true); } using (var db = new Database(MigrationsConfig.DbConnection)) { var logger = LogManager.GetLogger("Migration"); var targetMigration = migrationsToUse.LastOrDefault(); migLogger.Info($"Migrating from current database version {MigrationsConfig.DbVersion} to {targetMigration.Version}"); foreach (var migrations in migrationsToUse) { using (var transaction = db.GetTransaction()) { logger.Info($"Migration {migrations.Version} started."); try { foreach (var task in migrations.Tasks) { db.Execute(task.Execute); if (task.Test != null) { var result = db.ExecuteScalar <int>(task.Test); if (result != 1) { logger.Error($"Migration {migrations.Version} - Test failed! ({task.Test}) = {result})"); transaction.Dispose(); logger.Info($"Migration {migrations.Version} aborted and rolled back."); migLogger.Info($"Migration process aborted on failed Test. The current database version is {MigrationsConfig.DbVersion}"); return(false); } } } } catch (Exception e) { logger.Error($"Migration {migrations.Version} - {e.Message} ({e.StackTrace})"); transaction.Dispose(); logger.Info($"Migration {migrations.Version} aborted and rolled back."); migLogger.Info($"Migration process aborted on failed Task. The current database version is {MigrationsConfig.DbVersion}"); return(false); } transaction.Complete(); MigrationsConfig.DbVersion = migrations.Version; try { SaveConfig(); } catch (Exception e) { logger.Info($"Migration {migrations.Version} completed but database version " + $"could not be updated in {MigrationsConfigFilePath}.\r\n" + $"{e.Message}\r\n{e.StackTrace}"); migLogger.Info($"Migration {migrations.Version} completed but {MigrationsConfigFilePath} could not be updated."); return(false); } logger.Info($"Migration {migrations.Version} completed. Database version updated."); migLogger.Info($"Migration {migrations.Version} successfully completed."); } } migLogger.Info($"Migration successfully completed. The current database version is {MigrationsConfig.DbVersion}"); return(true); } }