1
1
import 'dart:async' ;
2
+ import 'dart:developer' ;
2
3
import 'dart:js_interop' ;
3
4
import 'dart:js_interop_unsafe' ;
4
5
5
6
import 'package:sqlite3/common.dart' ;
6
7
import 'package:sqlite3_web/sqlite3_web.dart' ;
7
8
import 'package:sqlite3_web/protocol_utils.dart' as proto;
8
9
import 'package:sqlite_async/sqlite_async.dart' ;
10
+ import 'package:sqlite_async/src/utils/profiler.dart' ;
9
11
import 'package:sqlite_async/src/utils/shared_utils.dart' ;
10
12
import 'package:sqlite_async/src/web/database/broadcast_updates.dart' ;
11
13
import 'package:sqlite_async/web.dart' ;
@@ -17,6 +19,7 @@ class WebDatabase
17
19
implements SqliteDatabase , WebSqliteConnection {
18
20
final Database _database;
19
21
final Mutex ? _mutex;
22
+ final bool profileQueries;
20
23
21
24
/// For persistent databases that aren't backed by a shared worker, we use
22
25
/// web broadcast channels to forward local update events to other tabs.
@@ -25,7 +28,12 @@ class WebDatabase
25
28
@override
26
29
bool closed = false ;
27
30
28
- WebDatabase (this ._database, this ._mutex, {this .broadcastUpdates});
31
+ WebDatabase (
32
+ this ._database,
33
+ this ._mutex, {
34
+ required this .profileQueries,
35
+ this .broadcastUpdates,
36
+ });
29
37
30
38
@override
31
39
Future <void > close () async {
@@ -175,7 +183,10 @@ class _SharedContext implements SqliteReadContext {
175
183
final WebDatabase _database;
176
184
bool _contextClosed = false ;
177
185
178
- _SharedContext (this ._database);
186
+ final TimelineTask ? _task;
187
+
188
+ _SharedContext (this ._database)
189
+ : _task = _database.profileQueries ? TimelineTask () : null ;
179
190
180
191
@override
181
192
bool get closed => _contextClosed || _database.closed;
@@ -196,8 +207,13 @@ class _SharedContext implements SqliteReadContext {
196
207
@override
197
208
Future <ResultSet > getAll (String sql,
198
209
[List <Object ?> parameters = const []]) async {
199
- return await wrapSqliteException (
200
- () => _database._database.select (sql, parameters));
210
+ try {
211
+ _task? .start ('getAll' , arguments: timelineArgs (sql, parameters));
212
+ return await wrapSqliteException (
213
+ () => _database._database.select (sql, parameters));
214
+ } finally {
215
+ _task? .finish ();
216
+ }
201
217
}
202
218
203
219
@override
@@ -248,9 +264,8 @@ class _ExclusiveTransactionContext extends _ExclusiveContext {
248
264
@override
249
265
bool get closed => baseContext.closed;
250
266
251
- @override
252
- Future <ResultSet > execute (String sql,
253
- [List <Object ?> parameters = const []]) async {
267
+ Future <ResultSet > _executeInternal (
268
+ String sql, List <Object ?> parameters) async {
254
269
// Operations inside transactions are executed with custom requests
255
270
// in order to verify that the connection does not have autocommit enabled.
256
271
// The worker will check if autocommit = true before executing the SQL.
@@ -294,6 +309,17 @@ class _ExclusiveTransactionContext extends _ExclusiveContext {
294
309
});
295
310
}
296
311
312
+ @override
313
+ Future <ResultSet > execute (String sql,
314
+ [List <Object ?> parameters = const []]) async {
315
+ try {
316
+ _task? .start ('execute' , arguments: timelineArgs (sql, parameters));
317
+ return await _executeInternal (sql, parameters);
318
+ } finally {
319
+ _task? .finish ();
320
+ }
321
+ }
322
+
297
323
@override
298
324
Future <void > executeBatch (
299
325
String sql, List <List <Object ?>> parameterSets) async {
0 commit comments