mirror of https://github.com/AMT-Cheif/drift.git
Remote: Support nested transactions
This commit is contained in:
parent
8def7055a0
commit
e37daa3b95
|
@ -163,11 +163,11 @@ class _RemoteTransactionExecutor extends _BaseExecutor
|
||||||
SqlDialect get dialect => SqlDialect.sqlite;
|
SqlDialect get dialect => SqlDialect.sqlite;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get supportsNestedTransactions => false;
|
bool get supportsNestedTransactions => true;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
TransactionExecutor beginTransaction() {
|
TransactionExecutor beginTransaction() {
|
||||||
throw UnsupportedError('Nested transactions');
|
return _RemoteTransactionExecutor(client, _executorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -98,6 +98,57 @@ void main() {
|
||||||
Uint8List(12),
|
Uint8List(12),
|
||||||
]));
|
]));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('nested transactions', () async {
|
||||||
|
final controller = StreamChannelController();
|
||||||
|
final executor = MockExecutor();
|
||||||
|
final outerTransaction = executor.transactions;
|
||||||
|
// avoid this object being created implicitly in the beginTransaction() when
|
||||||
|
// stub because that breaks mockito.
|
||||||
|
outerTransaction.transactions; // ignore: unnecessary_statements
|
||||||
|
final innerTransactions = <MockTransactionExecutor>[];
|
||||||
|
|
||||||
|
TransactionExecutor newTransaction(Invocation _) {
|
||||||
|
final transaction = MockTransactionExecutor()..transactions;
|
||||||
|
innerTransactions.add(transaction);
|
||||||
|
when(transaction.beginTransaction()).thenAnswer(newTransaction);
|
||||||
|
return transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
when(outerTransaction.beginTransaction()).thenAnswer(newTransaction);
|
||||||
|
|
||||||
|
final server = DriftServer(DatabaseConnection.fromExecutor(executor));
|
||||||
|
server.serve(controller.foreign);
|
||||||
|
addTearDown(server.shutdown);
|
||||||
|
|
||||||
|
final db = TodoDb.connect(remote(controller.local));
|
||||||
|
addTearDown(db.close);
|
||||||
|
|
||||||
|
await db.transaction(() async {
|
||||||
|
final abortException = Exception('abort');
|
||||||
|
|
||||||
|
await expectLater(db.transaction(() async {
|
||||||
|
await db.select(db.todosTable).get();
|
||||||
|
throw abortException;
|
||||||
|
}), throwsA(abortException));
|
||||||
|
|
||||||
|
await db.transaction(() async {
|
||||||
|
await db.select(db.todosTable).get();
|
||||||
|
|
||||||
|
await db.transaction(() => db.select(db.todosTable).get());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
verify(outerTransaction.beginTransaction());
|
||||||
|
verify(innerTransactions[0].ensureOpen(any));
|
||||||
|
verify(innerTransactions[0].rollback());
|
||||||
|
verify(innerTransactions[1].ensureOpen(any));
|
||||||
|
verify(innerTransactions[1].beginTransaction());
|
||||||
|
verify(innerTransactions[2].ensureOpen(any));
|
||||||
|
verify(innerTransactions[2].send());
|
||||||
|
verify(innerTransactions[1].send());
|
||||||
|
verify(outerTransaction.send());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<Object?> _checkStreamOfSimple(Stream<Object?> source) {
|
Stream<Object?> _checkStreamOfSimple(Stream<Object?> source) {
|
||||||
|
|
Loading…
Reference in New Issue