status method
Future<PostgresqlMigrationStatus>
status({
- required SessionExecutor executor,
- required String migrationsDirectory,
Compares database history with local migration artifacts.
Implementation
Future<PostgresqlMigrationStatus> status({
required pg.SessionExecutor executor,
required String migrationsDirectory,
}) async {
final activeHistory = await runner.loadActiveHistory(executor);
final issues = <PostgresqlMigrationStatusIssue>[];
List<LocalMigrationArtifact> localArtifacts;
try {
localArtifacts = loadLocalMigrationArtifacts(
migrationsDirectory,
provider: PostgresqlMigrationRunner.providerName,
);
} on StateError catch (error) {
issues.add(
PostgresqlMigrationStatusIssue(
code: 'invalid-local-artifacts',
message: error.message,
),
);
localArtifacts = const <LocalMigrationArtifact>[];
} on UnsupportedError catch (error) {
issues.add(
PostgresqlMigrationStatusIssue(
code: 'local-artifacts-unavailable',
message: '$error',
),
);
return PostgresqlMigrationStatus(
localMigrationCount: 0,
activeMigrationCount: activeHistory.length,
issues: List<PostgresqlMigrationStatusIssue>.unmodifiable(issues),
);
}
final localByName = {
for (final artifact in localArtifacts) artifact.name: artifact,
};
final activeNames = activeHistory.map((record) => record.name).toSet();
for (final record in activeHistory) {
final local = localByName[record.name];
if (local == null) {
issues.add(
PostgresqlMigrationStatusIssue(
code: 'applied-migration-missing-locally',
message:
'Migration ${record.name} is active in the database but missing from $migrationsDirectory.',
),
);
continue;
}
if (record.checksum != null && record.checksum != local.checksum) {
issues.add(
PostgresqlMigrationStatusIssue(
code: 'checksum-mismatch',
message:
'Migration ${record.name} differs between database history and local artifacts.',
),
);
}
if (record.beforeSchema == null || record.afterSchema == null) {
issues.add(
PostgresqlMigrationStatusIssue(
code: 'missing-db-snapshot',
message:
'Migration ${record.name} was applied before database snapshots were recorded.',
),
);
}
}
for (final artifact in localArtifacts) {
if (!activeNames.contains(artifact.name)) {
issues.add(
PostgresqlMigrationStatusIssue(
code: 'local-migration-not-applied',
message:
'Local migration ${artifact.name} exists in $migrationsDirectory but is not currently active in the database.',
),
);
}
}
return PostgresqlMigrationStatus(
localMigrationCount: localArtifacts.length,
activeMigrationCount: activeHistory.length,
issues: List<PostgresqlMigrationStatusIssue>.unmodifiable(issues),
);
}