Skip to content

Commit a05478a

Browse files
add note for broken close call
1 parent d2779df commit a05478a

File tree

5 files changed

+21
-8
lines changed

5 files changed

+21
-8
lines changed

lib/src/web/database.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ class _ExclusiveTransactionContext extends _ExclusiveContext {
212212
@override
213213
Future<ResultSet> execute(String sql,
214214
[List<Object?> parameters = const []]) async {
215+
// TODO offload this to a custom request for single round trip
215216
final isAutoCommit = await getAutoCommit();
216217
if (isAutoCommit && !sql.toLowerCase().contains('begin')) {
217218
throw SqliteException(0,
@@ -223,6 +224,7 @@ class _ExclusiveTransactionContext extends _ExclusiveContext {
223224
@override
224225
Future<void> executeBatch(
225226
String sql, List<List<Object?>> parameterSets) async {
227+
// TODO offload this to a custom request for single round trip
226228
final isAutoCommit = await getAutoCommit();
227229
if (isAutoCommit && !sql.toLowerCase().contains('begin')) {
228230
throw SqliteException(0,

lib/src/web/database/web_sqlite_database.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ class SqliteDatabaseImpl
2121
return _connection.closed;
2222
}
2323

24+
final StreamController<UpdateNotification> updatesController =
25+
StreamController.broadcast();
26+
2427
@override
2528
late Stream<UpdateNotification> updates;
2629

@@ -68,13 +71,17 @@ class SqliteDatabaseImpl
6871
SqliteDatabaseImpl.withFactory(this.openFactory,
6972
{this.maxReaders = SqliteDatabase.defaultMaxReaders}) {
7073
mutex = MutexImpl();
74+
// This way the `updates` member is available synchronously
75+
updates = updatesController.stream;
7176
isInitialized = _init();
7277
}
7378

7479
Future<void> _init() async {
7580
_connection = await openFactory.openConnection(SqliteOpenOptions(
7681
primaryConnection: true, readOnly: false, mutex: mutex));
77-
updates = _connection.updates!;
82+
_connection.updates!.forEach((update) {
83+
updatesController.add(update);
84+
});
7885
}
7986

8087
T _runZoned<T>(T Function() callback, {required String debugContext}) {

lib/src/web/web_sqlite_open_factory.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:sqlite_async/src/web/web_mutex.dart';
77

88
import 'database.dart';
99

10-
Map<SqliteOptions, WebSqlite> webSQLiteImplementations = {};
10+
Map<String, FutureOr<WebSqlite>> webSQLiteImplementations = {};
1111

1212
/// Web implementation of [AbstractDefaultSqliteOpenFactory]
1313
class DefaultSqliteOpenFactory
@@ -20,15 +20,18 @@ class DefaultSqliteOpenFactory
2020
{required super.path,
2121
super.sqliteOptions = const SqliteOptions.defaults()})
2222
: _initialized = Future.sync(() {
23-
if (webSQLiteImplementations.containsKey(sqliteOptions)) {
24-
return webSQLiteImplementations[sqliteOptions]!;
23+
final cacheKey = sqliteOptions.webSqliteOptions.wasmUri +
24+
sqliteOptions.webSqliteOptions.workerUri;
25+
26+
if (webSQLiteImplementations.containsKey(cacheKey)) {
27+
return webSQLiteImplementations[cacheKey]!;
2528
}
2629

27-
webSQLiteImplementations[sqliteOptions] = WebSqlite.open(
30+
webSQLiteImplementations[cacheKey] = WebSqlite.open(
2831
wasmModule: Uri.parse(sqliteOptions.webSqliteOptions.wasmUri),
2932
worker: Uri.parse(sqliteOptions.webSqliteOptions.workerUri),
3033
);
31-
return webSQLiteImplementations[sqliteOptions]!;
34+
return webSQLiteImplementations[cacheKey]!;
3235
});
3336

3437
@override

lib/src/web/worker/worker_utils.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'dart:js_interop';
2-
import 'dart:js_interop_unsafe';
32

43
import 'package:mutex/mutex.dart';
54
import 'package:sqlite3/wasm.dart';
@@ -8,7 +7,7 @@ import 'package:sqlite_async/sqlite3_common.dart';
87

98
import '../protocol.dart';
109

11-
final class AsyncSqliteController extends DatabaseController {
10+
base class AsyncSqliteController extends DatabaseController {
1211
@override
1312
Future<WorkerDatabase> openDatabase(
1413
WasmSqlite3 sqlite3, String path, String vfs) async {

test/basic_shared_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ void main() {
3838
'INSERT INTO test_data(description) VALUES(?)', ['test']);
3939
}, throwsA((e) => e is LockError && e.message.contains('tx.execute')));
4040
});
41+
// Uncomment this to break this test
42+
// await db.close();
4143
});
4244

4345
test('should allow PRAMGAs', () async {

0 commit comments

Comments
 (0)