@@ -4,6 +4,7 @@ import 'dart:js_interop';
4
4
import 'package:sqlite3/common.dart' ;
5
5
import 'package:sqlite3_web/sqlite3_web.dart' ;
6
6
import 'package:sqlite_async/mutex.dart' ;
7
+ import 'package:sqlite_async/sqlite_async.dart' ;
7
8
import 'package:sqlite_async/src/common/sqlite_database.dart' ;
8
9
import 'package:sqlite_async/src/sqlite_connection.dart' ;
9
10
import 'package:sqlite_async/src/sqlite_queries.dart' ;
@@ -84,33 +85,29 @@ class WebDatabase
84
85
Stream <UpdateNotification > get updates =>
85
86
_database.updates.map ((event) => UpdateNotification ({event.tableName}));
86
87
87
- @override
88
- Future <T > writeLock <T >(Future <T > Function (SqliteWriteContext tx) callback,
89
- {Duration ? lockTimeout, String ? debugContext}) async {
90
- return _writeLock (callback,
91
- lockTimeout: lockTimeout, debugContext: debugContext);
92
- }
93
-
94
88
@override
95
89
Future <T > writeTransaction <T >(
96
90
Future <T > Function (SqliteWriteContext tx) callback,
97
91
{Duration ? lockTimeout}) {
98
- return _writeLock ((ctx) => internalWriteTransaction (ctx, callback),
92
+ return writeLock (
93
+ (writeContext) =>
94
+ internalWriteTransaction (writeContext, (context) async {
95
+ // All execute calls done in the callback will be checked for the
96
+ // autocommit state
97
+ return callback (_ExclusiveTransactionContext (this , writeContext));
98
+ }),
99
99
debugContext: 'writeTransaction()' ,
100
- isTransaction: true ,
101
100
lockTimeout: lockTimeout);
102
101
}
103
102
103
+ @override
104
+
104
105
/// Internal writeLock which intercepts transaction context's to verify auto commit is not active
105
- Future <T > _writeLock <T >(Future <T > Function (SqliteWriteContext tx) callback,
106
- {Duration ? lockTimeout,
107
- String ? debugContext,
108
- bool isTransaction = false }) async {
106
+ Future <T > writeLock <T >(Future <T > Function (SqliteWriteContext tx) callback,
107
+ {Duration ? lockTimeout, String ? debugContext}) async {
109
108
if (_mutex case var mutex? ) {
110
109
return await mutex.lock (() async {
111
- final context = isTransaction
112
- ? _ExclusiveTransactionContext (this )
113
- : _ExclusiveContext (this );
110
+ final context = _ExclusiveContext (this );
114
111
try {
115
112
return await callback (context);
116
113
} finally {
@@ -121,11 +118,7 @@ class WebDatabase
121
118
// No custom mutex, coordinate locks through shared worker.
122
119
await _database.customRequest (CustomDatabaseMessage (
123
120
CustomDatabaseMessageKind .requestExclusiveLock));
124
- final context = isTransaction
125
- ? _ExclusiveTransactionContext (this )
126
- : _ExclusiveContext (this );
127
- ;
128
-
121
+ final context = _ExclusiveContext (this );
129
122
try {
130
123
return await callback (context);
131
124
} finally {
@@ -207,47 +200,56 @@ class _ExclusiveContext extends _SharedContext implements SqliteWriteContext {
207
200
}
208
201
209
202
class _ExclusiveTransactionContext extends _ExclusiveContext {
210
- _ExclusiveTransactionContext (super .database);
203
+ SqliteWriteContext baseContext;
204
+ _ExclusiveTransactionContext (super .database, this .baseContext);
205
+
206
+ @override
207
+ bool get closed => baseContext.closed;
211
208
212
209
@override
213
210
Future <ResultSet > execute (String sql,
214
211
[List <Object ?> parameters = const []]) async {
215
- var res = await _database._database.customRequest (CustomDatabaseMessage (
216
- CustomDatabaseMessageKind .executeInTransaction, sql, parameters));
217
- var result = Map <String , dynamic >.from ((res as JSObject ).dartify () as Map );
218
- final columnNames = [
219
- for (final entry in result['columnNames' ]) entry as String
220
- ];
221
- final rawTableNames = result['tableNames' ];
222
- final tableNames = rawTableNames != null
223
- ? [
224
- for (final entry in (rawTableNames as List <Object ?>))
225
- entry as String
226
- ]
227
- : null ;
228
-
229
- final rows = < List <Object ?>> [];
230
- for (final row in (result['rows' ] as List <Object ?>)) {
231
- final dartRow = < Object ? > [];
232
-
233
- for (final column in (row as List <Object ?>)) {
234
- dartRow.add (column);
235
- }
212
+ return await wrapSqliteException (() async {
213
+ var res = await _database._database.customRequest (CustomDatabaseMessage (
214
+ CustomDatabaseMessageKind .executeInTransaction, sql, parameters));
215
+ var result =
216
+ Map <String , dynamic >.from ((res as JSObject ).dartify () as Map );
217
+ final columnNames = [
218
+ for (final entry in result['columnNames' ]) entry as String
219
+ ];
220
+ final rawTableNames = result['tableNames' ];
221
+ final tableNames = rawTableNames != null
222
+ ? [
223
+ for (final entry in (rawTableNames as List <Object ?>))
224
+ entry as String
225
+ ]
226
+ : null ;
227
+
228
+ final rows = < List <Object ?>> [];
229
+ for (final row in (result['rows' ] as List <Object ?>)) {
230
+ final dartRow = < Object ? > [];
231
+
232
+ for (final column in (row as List <Object ?>)) {
233
+ dartRow.add (column);
234
+ }
236
235
237
- rows.add (dartRow);
238
- }
239
- final resultSet = ResultSet (columnNames, tableNames, rows);
240
- return resultSet;
236
+ rows.add (dartRow);
237
+ }
238
+ final resultSet = ResultSet (columnNames, tableNames, rows);
239
+ return resultSet;
240
+ });
241
241
}
242
242
243
243
@override
244
244
Future <void > executeBatch (
245
245
String sql, List <List <Object ?>> parameterSets) async {
246
- for (final set in parameterSets) {
247
- await _database._database.customRequest (CustomDatabaseMessage (
248
- CustomDatabaseMessageKind .executeBatchInTransaction, sql, set ));
249
- }
250
- return ;
246
+ return await wrapSqliteException (() async {
247
+ for (final set in parameterSets) {
248
+ await _database._database.customRequest (CustomDatabaseMessage (
249
+ CustomDatabaseMessageKind .executeBatchInTransaction, sql, set ));
250
+ }
251
+ return ;
252
+ });
251
253
}
252
254
}
253
255
0 commit comments