Skip to content

Commit cae008a

Browse files
committed
Start looking at sqlite3_web integration
1 parent a6c3d72 commit cae008a

4 files changed

Lines changed: 198 additions & 0 deletions

File tree

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import 'dart:js_interop';
2+
3+
import 'package:drift3/drift.dart';
4+
import 'package:sqlite3/common.dart';
5+
import 'package:sqlite3_web/protocol_utils.dart' as utils;
6+
import 'package:sqlite3_web/sqlite3_web.dart';
7+
8+
import 'web/protocol.dart';
9+
10+
abstract base class _BaseWebSession implements DriftSession {
11+
final Database database;
12+
13+
_BaseWebSession(this.database);
14+
15+
LockToken? get lockToken => null;
16+
bool get requireInTransaction => false;
17+
18+
@override
19+
Future<QueryResult> execute(StatementInfo statement) async {
20+
final (params, paramTypes) = utils.serializeParameters(
21+
statement.variables.map((p) => p.rawValue).toList(),
22+
);
23+
24+
final response = await database.customRequest(
25+
ExecuteRequest(
26+
sql: statement.sql,
27+
needsResultSet: statement.needsResultSet,
28+
parameters: params,
29+
parameterTypes: paramTypes,
30+
requireInTransaction: requireInTransaction,
31+
),
32+
token: lockToken,
33+
);
34+
35+
return (response as SerializedQueryResult).asQueryResult();
36+
}
37+
38+
@override
39+
Future<List<QueryResult>> executeBatch(StatementBatch batch) {
40+
// TODO: implement executeBatch
41+
throw UnimplementedError();
42+
}
43+
}
44+
45+
final class WebSession extends _BaseWebSession
46+
implements DriftSessionWithInternalLocks {
47+
WebSession(super.database);
48+
49+
@override
50+
Future<void> close() {
51+
// TODO: implement close
52+
throw UnimplementedError();
53+
}
54+
55+
@override
56+
// TODO: implement closed
57+
Future<void> get closed => throw UnimplementedError();
58+
59+
@override
60+
// TODO: implement isClosed
61+
bool get isClosed => throw UnimplementedError();
62+
63+
@override
64+
DriftSessionWithInternalLocks? get locks => this;
65+
66+
@override
67+
PersistentSchemaVersion? get persistentSchemaVersion =>
68+
throw UnimplementedError();
69+
70+
@override
71+
Object? get tag => null;
72+
73+
@override
74+
DriftTransactionSession? get transaction => null;
75+
76+
@override
77+
DriftTransactionParent? get transactionParent => throw UnimplementedError();
78+
79+
@override
80+
Future<DriftSession> exclusive() {
81+
// TODO: implement exclusive
82+
throw UnimplementedError();
83+
}
84+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import 'dart:js_interop';
2+
3+
import 'package:drift3/drift.dart';
4+
import 'package:meta/meta.dart';
5+
import 'package:sqlite3_web/protocol_utils.dart' as utils;
6+
7+
@JS()
8+
@anonymous
9+
@internal
10+
extension type ExecuteRequest._(JSObject _) implements JSObject {
11+
@JS('a')
12+
external String get sql;
13+
@JS('b')
14+
external JSArray get parameters;
15+
@JS('c')
16+
external JSArrayBuffer get parameterTypes;
17+
@JS('d')
18+
external bool get needsResultSet;
19+
@JS('e')
20+
external bool requireInTransaction;
21+
22+
external factory ExecuteRequest({
23+
@JS('a') required String sql,
24+
@JS('b') required JSArray parameters,
25+
@JS('c') required JSArrayBuffer parameterTypes,
26+
@JS('d') required bool needsResultSet,
27+
@JS('e') required bool requireInTransaction,
28+
});
29+
30+
List<Object?> get decodedParameters =>
31+
utils.deserializeParameters(parameters, parameterTypes);
32+
}
33+
34+
@JS()
35+
@anonymous
36+
@internal
37+
extension type SerializedQueryResult._(JSObject _) implements JSObject {
38+
@JS('a')
39+
external JSNumber? get affectedRows;
40+
@JS('b')
41+
external JSNumber? get lastInsertRowId;
42+
@JS('c')
43+
external JSObject? get serializedResultSet;
44+
45+
external factory SerializedQueryResult({
46+
@JS('a') required JSNumber? affectedRows,
47+
@JS('b') required JSNumber? lastInsertRowId,
48+
@JS('c') required JSObject? serializedResultSet,
49+
});
50+
51+
QueryResult asQueryResult() {
52+
RawResultSet? resultSet;
53+
if (serializedResultSet case final serialized?) {
54+
final rawResultSet = utils.deserializeResultSet(serialized);
55+
RawResultSet.fromRows(
56+
columnNames: rawResultSet.columnNames,
57+
rows: rawResultSet.rows,
58+
);
59+
}
60+
61+
return QueryResult(
62+
resultSet: resultSet,
63+
affectedRows: affectedRows?.toDartInt,
64+
lastInsertRowId: lastInsertRowId?.toDartInt,
65+
);
66+
}
67+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import 'dart:js_interop';
2+
3+
import 'package:sqlite3/common.dart';
4+
import 'package:sqlite3_web/sqlite3_web.dart';
5+
import 'package:sqlite3_web/protocol_utils.dart' as utils;
6+
7+
import '../shared.dart';
8+
import 'protocol.dart';
9+
10+
final class DriftDatabase extends WorkerDatabase {
11+
@override
12+
final CommonDatabase database;
13+
14+
DriftDatabase(this.database);
15+
16+
@override
17+
Future<JSAny?> handleCustomRequest(
18+
ClientConnection connection,
19+
CustomClientDatabaseRequest request,
20+
) {
21+
final data = request.request as ExecuteRequest;
22+
23+
return request.useLock(() {
24+
if (data.needsResultSet && data.parameters.length == 0) {
25+
database.execute(data.sql);
26+
}
27+
28+
final stmt = database.prepare(data.sql, checkNoTail: true);
29+
final params = data.decodedParameters;
30+
ResultSet? resultSet;
31+
if (data.needsResultSet) {
32+
resultSet = stmt.select(params);
33+
} else {
34+
stmt.execute(params);
35+
}
36+
37+
return SerializedQueryResult(
38+
affectedRows: database.updatedRows.toJS,
39+
lastInsertRowId: database.lastInsertRowId.toJS,
40+
serializedResultSet: resultSet == null
41+
? null
42+
: utils.serializeResultSet(resultSet),
43+
);
44+
});
45+
}
46+
}

future/drift_sqlite/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies:
1515
collection: ^1.18.0
1616
sqlite3: ^3.1.6
1717
sqlite3_connection_pool: ^0.2.3
18+
sqlite3_web: ^0.6.0
1819

1920
dev_dependencies:
2021
lints: ^6.0.0

0 commit comments

Comments
 (0)