11import 'dart:async' ;
2+ import 'dart:developer' ;
23import 'dart:js_interop' ;
34import 'dart:js_interop_unsafe' ;
45
56import 'package:sqlite3/common.dart' ;
67import 'package:sqlite3_web/sqlite3_web.dart' ;
78import 'package:sqlite3_web/protocol_utils.dart' as proto;
89import 'package:sqlite_async/sqlite_async.dart' ;
10+ import 'package:sqlite_async/src/utils/profiler.dart' ;
911import 'package:sqlite_async/src/utils/shared_utils.dart' ;
1012import 'package:sqlite_async/src/web/database/broadcast_updates.dart' ;
1113import 'package:sqlite_async/web.dart' ;
@@ -17,6 +19,7 @@ class WebDatabase
1719 implements SqliteDatabase , WebSqliteConnection {
1820 final Database _database;
1921 final Mutex ? _mutex;
22+ final bool profileQueries;
2023
2124 /// For persistent databases that aren't backed by a shared worker, we use
2225 /// web broadcast channels to forward local update events to other tabs.
@@ -25,7 +28,12 @@ class WebDatabase
2528 @override
2629 bool closed = false ;
2730
28- WebDatabase (this ._database, this ._mutex, {this .broadcastUpdates});
31+ WebDatabase (
32+ this ._database,
33+ this ._mutex, {
34+ required this .profileQueries,
35+ this .broadcastUpdates,
36+ });
2937
3038 @override
3139 Future <void > close () async {
@@ -175,7 +183,10 @@ class _SharedContext implements SqliteReadContext {
175183 final WebDatabase _database;
176184 bool _contextClosed = false ;
177185
178- _SharedContext (this ._database);
186+ final TimelineTask ? _task;
187+
188+ _SharedContext (this ._database)
189+ : _task = _database.profileQueries ? TimelineTask () : null ;
179190
180191 @override
181192 bool get closed => _contextClosed || _database.closed;
@@ -196,8 +207,13 @@ class _SharedContext implements SqliteReadContext {
196207 @override
197208 Future <ResultSet > getAll (String sql,
198209 [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+ }
201217 }
202218
203219 @override
@@ -248,9 +264,8 @@ class _ExclusiveTransactionContext extends _ExclusiveContext {
248264 @override
249265 bool get closed => baseContext.closed;
250266
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 {
254269 // Operations inside transactions are executed with custom requests
255270 // in order to verify that the connection does not have autocommit enabled.
256271 // The worker will check if autocommit = true before executing the SQL.
@@ -294,6 +309,17 @@ class _ExclusiveTransactionContext extends _ExclusiveContext {
294309 });
295310 }
296311
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+
297323 @override
298324 Future <void > executeBatch (
299325 String sql, List <List <Object ?>> parameterSets) async {
0 commit comments