readSqliteMigrations function

List<SqliteMigration> readSqliteMigrations(
  1. String directoryPath
)

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);
}