rollback method

  1. @override
Future rollback()
override

Implementation

@override
Future rollback() async {
  await _init();

  var result = await connection.query('SELECT MAX(batch) from migrations;');

  var curBatch = 0;
  if (result.isNotEmpty) {
    var firstRow = result.toList();
    curBatch = int.tryParse(firstRow[0][0]) as int;
  }

  result = await connection
      .query('SELECT path from migrations WHERE batch = $curBatch;');
  var existing = <String>[];
  if (result.isNotEmpty) {
    existing = result.expand((x) => x).cast<String>().toList();
  }

  var toRun = <String>[];

  migrations.forEach((k, v) {
    if (existing.contains(k)) toRun.add(k);
  });

  if (toRun.isNotEmpty) {
    for (var k in toRun.reversed) {
      var migration = migrations[k]!;
      var schema = MariaDbSchema();
      migration.down(schema);
      _log.info('Removed "$k" from "migrations" table.');
      await schema.run(connection).then((_) {
        return connection
            .query('DELETE FROM migrations WHERE path = \'$k\';');
      });
    }
  } else {
    _log.warning('Nothing to remove from "migrations" table.');
  }
}