Exemplo n.º 1
0
        /// <inheritdoc />
        public async Task MigrateAsync(CancellationToken token = default)
        {
            try
            {
                if (_migrationMap.Count == 0)
                {
                    _logger?.LogWarning("No migrations were added to migrator. Skip migration");
                    return;
                }

                // check if database exists and create if not
                _logger?.LogInformation($"Check Database \"{_dbProvider.DbName}\" existence...");
                var isDatabaseExist = await _dbProvider.CheckIfDatabaseExistsAsync(_dbProvider.DbName, token);

                if (isDatabaseExist)
                {
                    _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" exists. Starting migration...");
                }
                else
                {
                    _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" doesn't exist. Creating database...");
                    await _dbProvider.CreateDatabaseIfNotExistsAsync(token);

                    _logger?.LogInformation("Creating database completed.");
                }

                await _dbProvider.OpenConnectionAsync(token);

                // check if applied migrations table exists and create if not
                _logger?.LogInformation($"Check \"{_dbProvider.AppliedMigrationsTableName}\" table existence...");
                var isMigrationTableExists = await _dbProvider.CheckIfTableExistsAsync(_dbProvider.AppliedMigrationsTableName, token);

                if (isMigrationTableExists)
                {
                    _logger?.LogInformation($"Table \"{_dbProvider.AppliedMigrationsTableName}\" exists. ");
                }
                else
                {
                    _logger?.LogInformation($"Creating \"{_dbProvider.AppliedMigrationsTableName}\" table...");
                    await _dbProvider.CreateAppliedMigrationsTableIfNotExistsAsync(token);

                    _logger?.LogInformation($"Creating \"{_dbProvider.AppliedMigrationsTableName}\" table completed.");
                }

                // get applied migrations versions
                var(isUpgrade, migrationsToApply) = await GetMigrationsAsync(false, token);

                if (migrationsToApply.Count == 0)
                {
                    _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" is actual. Skip migration.");
                    return;
                }

                _logger?.LogInformation($"Executing pre-migration scripts for database \"{_dbProvider.DbName}\"...");
                var wasPreMigrationExecuted = await ExecutePreMigrationScriptsAsync(token);

                if (wasPreMigrationExecuted)
                {
                    _logger?.LogInformation($"Executing pre-migration scripts for database \"{_dbProvider.DbName}\" completed.");

                    // applied migration versions might be changed after pre-migration
                    (isUpgrade, migrationsToApply) = await GetMigrationsAsync(true, token);
                }
                else
                {
                    _logger?.LogInformation("No pre-migration scripts were found.");
                }

                if (migrationsToApply.Count == 0)
                {
                    _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" is actual. Skip migration.");
                    return;
                }

                _logger?.LogInformation($"Migrating database \"{_dbProvider.DbName}\"...");
                var policy = isUpgrade
                    ? _upgradePolicy
                    : _downgradePolicy;
                await MigrateAsync(migrationsToApply, isUpgrade, policy, token);

                await _dbProvider.CloseConnectionAsync();

                _logger?.LogInformation($"Migrating database {_dbProvider.DbName} completed.");
            }
            catch (MigrationException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new MigrationException(
                          MigrationError.MigratingError,
                          $"Error while migrating database {_dbProvider.DbName}. Reason: {e.Message}",
                          e);
            }
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public async Task MigrateAsync()
        {
            try
            {
                await _dbProvider.CreateDatabaseIfNotExistsAsync();

                await _dbProvider.OpenConnectionAsync();

                var dbVersion = await GetCurrentDbVersion();

                var targetVersion = _targetVersion ?? _migrations.Max(x => x.Version);
                if (targetVersion == dbVersion)
                {
                    _logger?.LogInformation($"Database {_dbProvider.DbName} is actual. Skip migration.");
                    return;
                }

                if (_migrations.All(x => x.Version != targetVersion))
                {
                    throw new MigrationException(MigrationError.MigrationNotFound,
                                                 $"Migration {targetVersion} not found");
                }


                _logger?.LogInformation($"Executing pre migration scripts for {_dbProvider.DbName}...");
                await ExecutePreMigrationScriptsAsync();

                _logger?.LogInformation($"Executing pre migration scripts for{_dbProvider.DbName} completed.");

                await _dbProvider.CreateHistoryTableIfNotExistsAsync();

                // DB version might change after pre-migration
                dbVersion = await GetCurrentDbVersion();

                _logger?.LogInformation($"Migrating database {_dbProvider.DbName}...");
                if (targetVersion > dbVersion)
                {
                    _logger?.LogInformation(
                        $"Upgrading database {_dbProvider.DbName} from {dbVersion} to {targetVersion}...");
                    await UpgradeAsync(dbVersion, targetVersion);

                    _logger?.LogInformation($"Upgrading database {_dbProvider.DbName} completed.");
                }
                else
                {
                    _logger?.LogInformation(
                        $"Downgrading database {_dbProvider.DbName} from {dbVersion} to {targetVersion}...");
                    await DowngradeAsync(dbVersion, targetVersion);

                    _logger?.LogInformation($"Downgrading database {_dbProvider.DbName} completed.");
                }

                await _dbProvider.CloseConnectionAsync();

                _logger?.LogInformation($"Migrating database {_dbProvider.DbName} completed.");
            }
            catch (Exception e)
            {
                _logger?.LogError(e, $"Error while migrating database {_dbProvider.DbName}");
                throw;
            }
        }