readSqliteMigrations function
Reads top-level NNNN_snake_case.sql files from directoryPath.
The returned migrations are ordered by their numeric prefix. Other files
are ignored, while invalid .sql entries and duplicate versions fail
before a database is changed.
Implementation
List<SqliteMigration> readSqliteMigrations(String directoryPath) {
if (directoryPath.isEmpty) {
throw ArgumentError.value(
directoryPath,
'directoryPath',
'must not be empty',
);
}
final directory = Directory(directoryPath).absolute;
if (!directory.existsSync()) {
throw FileSystemException(
'SQLite migration directory does not exist.',
directory.path,
);
}
final migrations = <SqliteMigration>[];
for (final entity in directory.listSync(followLinks: false)) {
final name = p.basename(entity.path);
if (name.startsWith('.') || !name.endsWith('.sql')) continue;
if (entity is! File) {
throw FormatException(
'SQLite migration must be a top-level regular file: $name',
);
}
migrations.add(SqliteMigration(name: name, sql: entity.readAsStringSync()));
}
migrations.sort((left, right) {
final version = left.version.compareTo(right.version);
return version == 0 ? left.name.compareTo(right.name) : version;
});
for (var index = 1; index < migrations.length; index++) {
if (migrations[index - 1].version == migrations[index].version) {
throw FormatException(
'SQLite migration version ${migrations[index].version} is duplicated.',
);
}
}
return List<SqliteMigration>.unmodifiable(migrations);
}