Merge pull request #181 from minia68/master

Make transaction return a value
This commit is contained in:
Simon Binder 2019-10-10 17:06:05 +02:00 committed by GitHub
commit e66eaa6127
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 6 deletions

View File

@ -7,7 +7,7 @@ environment:
sdk: '>=2.4.0 <3.0.0' sdk: '>=2.4.0 <3.0.0'
dependencies: dependencies:
moor: ^1.6.0 moor: ^2.0.0
sqflite: sqflite:
git: git:
url: https://www.github.com/davidmartos96/sqflite_sqlcipher.git url: https://www.github.com/davidmartos96/sqflite_sqlcipher.git
@ -15,4 +15,4 @@ dependencies:
dependency_overrides: dependency_overrides:
moor: moor:
path: ../../moor path: ../../moor

View File

@ -286,22 +286,23 @@ mixin QueryEngine on DatabaseConnectionUser {
/// inside a transaction returns the parent transaction. /// inside a transaction returns the parent transaction.
@protected @protected
@visibleForTesting @visibleForTesting
Future transaction(Future Function() action) async { Future<T> transaction<T>(Future<T> Function() action) async {
final resolved = _resolvedEngine; final resolved = _resolvedEngine;
if (resolved is Transaction) { if (resolved is Transaction) {
return action(); return action();
} }
final executor = resolved.executor; final executor = resolved.executor;
await executor.doWhenOpened((executor) { return await executor.doWhenOpened((executor) {
final transactionExecutor = executor.beginTransaction(); final transactionExecutor = executor.beginTransaction();
final transaction = Transaction(this, transactionExecutor); final transaction = Transaction(this, transactionExecutor);
return _runEngineZoned(transaction, () async { return _runEngineZoned(transaction, () async {
var success = false; var success = false;
try { try {
await action(); final result = await action();
success = true; success = true;
return result;
} catch (e) { } catch (e) {
await transactionExecutor.rollback(); await transactionExecutor.rollback();

View File

@ -14,7 +14,7 @@ class BeforeOpenEngine extends DatabaseConnectionUser with QueryEngine {
@override @override
@alwaysThrows @alwaysThrows
Future transaction(Function action) { Future<T> transaction<T>(Function action) {
throw UnsupportedError("Transactions can't be started inside beforeOpen"); throw UnsupportedError("Transactions can't be started inside beforeOpen");
} }
} }

View File

@ -99,4 +99,9 @@ void main() {
verify(executor.doWhenOpened(any)); verify(executor.doWhenOpened(any));
}); });
}); });
test('transaction return value', () async {
final actual = await db.transaction(() async => 1);
expect(actual, 1);
});
} }