mirror of https://github.com/AMT-Cheif/drift.git
Merge pull request #181 from minia68/master
Make transaction return a value
This commit is contained in:
commit
e66eaa6127
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue