コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }