transaction<T> method

  1. @override
Future<T> transaction<T>(
  1. Future<T> action()
)
override

Runs action inside a single atomic transaction. If action throws, every write performed during the callback is rolled back.

Implementation

@override
Future<T> transaction<T>(Future<T> Function() action) async {
  // Snapshot for rollback on throw.
  final tablesSnapshot = <String, Map<String, Map<String, dynamic>>>{
    for (final entry in _tables.entries)
      entry.key: {
        for (final row in entry.value.entries)
          row.key: _deepCopyRow(row.value),
      },
  };
  final queueSnapshot = List<SyncQueueEntry>.from(_queue);
  final metaSnapshot = Map<String, String>.from(_meta);
  try {
    return await action();
  } catch (_) {
    _tables
      ..clear()
      ..addAll(tablesSnapshot);
    _queue
      ..clear()
      ..addAll(queueSnapshot);
    _meta
      ..clear()
      ..addAll(metaSnapshot);
    rethrow;
  }
}