diff --git a/drift/lib/src/runtime/executor/helpers/delegates.dart b/drift/lib/src/runtime/executor/helpers/delegates.dart index 77fe2070..eac30823 100644 --- a/drift/lib/src/runtime/executor/helpers/delegates.dart +++ b/drift/lib/src/runtime/executor/helpers/delegates.dart @@ -3,6 +3,12 @@ import 'dart:async' show FutureOr; import 'package:drift/drift.dart'; import 'package:drift/src/runtime/executor/helpers/results.dart'; +String _defaultSavepoint(int depth) => 'SAVEPOINT s$depth'; + +String _defaultRelease(int depth) => 'RELEASE s$depth'; + +String _defaultRollbackToSavepoint(int depth) => 'ROLLBACK TO s$depth'; + /// An interface that supports sending database queries. Used as a backend for /// drift. /// @@ -132,6 +138,18 @@ class NoTransactionDelegate extends TransactionDelegate { /// database engine. final String rollback; + /// The statement that will create a savepoint for a given depth of a transaction + /// on this database engine. + final String Function(int depth) savepoint; + + /// The statement that will release a savepoint for a given depth of a transaction + /// on this database engine. + final String Function(int depth) release; + + /// The statement that will perform a rollback to a savepoint for a given depth + /// of a transaction on this database engine. + final String Function(int depth) rollbackToSavepoint; + /// Construct a transaction delegate indicating that native transactions /// aren't supported and need to be emulated by issuing statements and /// locking the database. @@ -139,6 +157,9 @@ class NoTransactionDelegate extends TransactionDelegate { this.start = 'BEGIN TRANSACTION', this.commit = 'COMMIT TRANSACTION', this.rollback = 'ROLLBACK TRANSACTION', + this.savepoint = _defaultSavepoint, + this.release = _defaultRelease, + this.rollbackToSavepoint = _defaultRollbackToSavepoint, }); } diff --git a/drift/lib/src/runtime/executor/helpers/engines.dart b/drift/lib/src/runtime/executor/helpers/engines.dart index f1e9bb74..55ac0779 100644 --- a/drift/lib/src/runtime/executor/helpers/engines.dart +++ b/drift/lib/src/runtime/executor/helpers/engines.dart @@ -187,11 +187,9 @@ class _StatementBasedTransactionExecutor extends _TransactionExecutor { _StatementBasedTransactionExecutor.nested( _StatementBasedTransactionExecutor this._parent, int depth) : _delegate = _parent._delegate, - _startCommand = 'SAVEPOINT s$depth', - _commitCommand = _parent._db.dialect == SqlDialect.mariadb - ? 'RELEASE SAVEPOINT s$depth' : 'RELEASE s$depth', - _rollbackCommand = _parent._db.dialect == SqlDialect.mariadb - ? 'ROLLBACK TO SAVEPOINT s$depth' : 'ROLLBACK TO s$depth', + _startCommand = _parent._delegate.savepoint(depth), + _commitCommand = _parent._delegate.release(depth), + _rollbackCommand = _parent._delegate.rollbackToSavepoint(depth), super(_parent._db); @override