1+ import 'dart:developer' ;
2+
13import 'package:sqlite3/common.dart' ;
24import 'package:sqlite_async/src/common/mutex.dart' ;
35import 'package:sqlite_async/src/sqlite_connection.dart' ;
46import 'package:sqlite_async/src/sqlite_queries.dart' ;
57import 'package:sqlite_async/src/update_notification.dart' ;
8+ import 'package:sqlite_async/src/utils/profiler.dart' ;
69
710/// A simple "synchronous" connection which provides the async SqliteConnection
811/// implementation using a synchronous SQLite connection
@@ -14,7 +17,12 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
1417
1518 bool _closed = false ;
1619
17- SyncSqliteConnection (this .db, Mutex m) {
20+ /// Whether queries should be added to the `dart:developer` timeline.
21+ ///
22+ /// This is disabled by default.
23+ final bool profileQueries;
24+
25+ SyncSqliteConnection (this .db, Mutex m, {this .profileQueries = false }) {
1826 mutex = m.open ();
1927 updates = db.updates.map (
2028 (event) {
@@ -26,15 +34,31 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
2634 @override
2735 Future <T > readLock <T >(Future <T > Function (SqliteReadContext tx) callback,
2836 {Duration ? lockTimeout, String ? debugContext}) {
29- return mutex.lock (() => callback (SyncReadContext (db)),
30- timeout: lockTimeout);
37+ final task = profileQueries ? TimelineTask () : null ;
38+ task? .start ('mutex_lock' );
39+
40+ return mutex.lock (
41+ () {
42+ task? .finish ();
43+ return callback (SyncReadContext (db, parent: task));
44+ },
45+ timeout: lockTimeout,
46+ );
3147 }
3248
3349 @override
3450 Future <T > writeLock <T >(Future <T > Function (SqliteWriteContext tx) callback,
3551 {Duration ? lockTimeout, String ? debugContext}) {
36- return mutex.lock (() => callback (SyncWriteContext (db)),
37- timeout: lockTimeout);
52+ final task = profileQueries ? TimelineTask () : null ;
53+ task? .start ('mutex_lock' );
54+
55+ return mutex.lock (
56+ () {
57+ task? .finish ();
58+ return callback (SyncWriteContext (db));
59+ },
60+ timeout: lockTimeout,
61+ );
3862 }
3963
4064 @override
@@ -53,9 +77,12 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
5377}
5478
5579class SyncReadContext implements SqliteReadContext {
80+ final TimelineTask ? task;
81+
5682 CommonDatabase db;
5783
58- SyncReadContext (this .db);
84+ SyncReadContext (this .db, {TimelineTask ? parent})
85+ : task = TimelineTask (parent: parent);
5986
6087 @override
6188 Future <T > computeWithDatabase <T >(
@@ -65,13 +92,21 @@ class SyncReadContext implements SqliteReadContext {
6592
6693 @override
6794 Future <Row > get (String sql, [List <Object ?> parameters = const []]) async {
68- return db.select (sql, parameters).first;
95+ return task.timeSync (
96+ 'get' ,
97+ () => db.select (sql, parameters).first,
98+ arguments: timelineArgs (sql, parameters),
99+ );
69100 }
70101
71102 @override
72103 Future <ResultSet > getAll (String sql,
73104 [List <Object ?> parameters = const []]) async {
74- return db.select (sql, parameters);
105+ return task.timeSync (
106+ 'getAll' ,
107+ () => db.select (sql, parameters),
108+ arguments: timelineArgs (sql, parameters),
109+ );
75110 }
76111
77112 @override
@@ -91,26 +126,31 @@ class SyncReadContext implements SqliteReadContext {
91126}
92127
93128class SyncWriteContext extends SyncReadContext implements SqliteWriteContext {
94- SyncWriteContext (super .db);
129+ SyncWriteContext (super .db, { super .parent} );
95130
96131 @override
97132 Future <ResultSet > execute (String sql,
98133 [List <Object ?> parameters = const []]) async {
99- return db.select (sql, parameters);
134+ return task.timeSync (
135+ 'execute' ,
136+ () => db.select (sql, parameters),
137+ arguments: timelineArgs (sql, parameters),
138+ );
100139 }
101140
102141 @override
103142 Future <void > executeBatch (
104143 String sql, List <List <Object ?>> parameterSets) async {
105- return computeWithDatabase ((db) async {
144+ task. timeSync ( 'executeBatch' , () {
106145 final statement = db.prepare (sql, checkNoTail: true );
107146 try {
108147 for (var parameters in parameterSets) {
109- statement.execute (parameters);
148+ task.timeSync ('iteration' , () => statement.execute (parameters),
149+ arguments: parameterArgs (parameters));
110150 }
111151 } finally {
112152 statement.dispose ();
113153 }
114- });
154+ }, arguments : { 'sql' : sql} );
115155 }
116156}
0 commit comments