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