private async Task <bool> MigrateNextAsync(long dbVersion, MigratorDatabase database, IList <Migration> migrations, CancellationToken cancellation = default) { using var task = await database.BeginTransactionAsync(cancellation); dbVersion = await _versionTable.GetCurrentVersionWithLockAsync(database); if (dbVersion >= _latestSchemaVersion) { return(false); } Interceptor?.PreMigration(database.Name, dbVersion, _latestSchemaVersion); migrations = migrations .Where(x => x.Version > dbVersion) .ToList(); var firstMigration = migrations.First(); if (firstMigration.DisableTransaction) { using (var noTransactionDatabase = database.Clone()) await ExecuteMigrationAsync(migrations.First(), noTransactionDatabase, cancellation); if (firstMigration.Version > dbVersion) { await _versionTable.SetVersionAsync(database, firstMigration.Version, cancellation); } await database.CommitAsync(cancellation); if (migrations.Count == 1) { Interceptor?.PostMigration(database.Name, dbVersion, _latestSchemaVersion); return(false); } return(true); } foreach (var migration in migrations) { cancellation.ThrowIfCancellationRequested(); if (migration.DisableTransaction) { await database.CommitAsync(cancellation); return(true); } await ExecuteMigrationAsync(migration, database, cancellation); if (migration.Version > dbVersion) { await _versionTable.SetVersionAsync(database, migration.Version, cancellation); } } await database.CommitAsync(cancellation); Interceptor?.PostMigration(database.Name, dbVersion, _latestSchemaVersion); return(false); }
private bool MigrateNext(long dbVersion, MigratorDatabase database) { using (database.BeginTransaction()) { dbVersion = VersionTable.GetCurrentVersionWithLock(database); if (dbVersion >= LatestSchemaVersion) { return(false); } Interceptor?.PreMigration(database.Name, dbVersion, LatestSchemaVersion); var migrations = Migrations .Where(x => x.Version > dbVersion) .ToArray(); var firstMigration = migrations.First(); if (firstMigration.DisableTransaction) { using (var noTransactionDatabase = database.Clone()) ExecuteMigration(migrations.First(), noTransactionDatabase); if (firstMigration.Version > dbVersion) { VersionTable.SetVersion(database, firstMigration.Version); } database.Commit(); if (migrations.Length == 1) { Interceptor?.PostMigration(database.Name, dbVersion, LatestSchemaVersion); return(false); } return(true); } foreach (var migration in migrations) { if (migration.DisableTransaction) { database.Commit(); return(true); } ExecuteMigration(migration, database); if (migration.Version > dbVersion) { VersionTable.SetVersion(database, migration.Version); } } database.Commit(); Interceptor?.PostMigration(database.Name, dbVersion, LatestSchemaVersion); return(false); } }