1
+ import 'dart:developer' ;
2
+
1
3
import 'package:sqlite3/common.dart' ;
2
4
import 'package:sqlite_async/src/common/mutex.dart' ;
3
5
import 'package:sqlite_async/src/sqlite_connection.dart' ;
6
+ import 'package:sqlite_async/src/sqlite_options.dart' ;
4
7
import 'package:sqlite_async/src/sqlite_queries.dart' ;
5
8
import 'package:sqlite_async/src/update_notification.dart' ;
9
+ import 'package:sqlite_async/src/utils/profiler.dart' ;
6
10
7
11
/// A simple "synchronous" connection which provides the async SqliteConnection
8
12
/// implementation using a synchronous SQLite connection
@@ -14,7 +18,15 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
14
18
15
19
bool _closed = false ;
16
20
17
- SyncSqliteConnection (this .db, Mutex m) {
21
+ /// Whether queries should be added to the `dart:developer` timeline.
22
+ ///
23
+ /// This is enabled by default outside of release builds, see
24
+ /// [SqliteOptions.profileQueries] for details.
25
+ final bool profileQueries;
26
+
27
+ SyncSqliteConnection (this .db, Mutex m, {bool ? profileQueries})
28
+ : profileQueries =
29
+ profileQueries ?? const SqliteOptions ().profileQueries {
18
30
mutex = m.open ();
19
31
updates = db.updates.map (
20
32
(event) {
@@ -26,15 +38,31 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
26
38
@override
27
39
Future <T > readLock <T >(Future <T > Function (SqliteReadContext tx) callback,
28
40
{Duration ? lockTimeout, String ? debugContext}) {
29
- return mutex.lock (() => callback (SyncReadContext (db)),
30
- timeout: lockTimeout);
41
+ final task = profileQueries ? TimelineTask () : null ;
42
+ task? .start ('${profilerPrefix }mutex_lock' );
43
+
44
+ return mutex.lock (
45
+ () {
46
+ task? .finish ();
47
+ return callback (SyncReadContext (db, parent: task));
48
+ },
49
+ timeout: lockTimeout,
50
+ );
31
51
}
32
52
33
53
@override
34
54
Future <T > writeLock <T >(Future <T > Function (SqliteWriteContext tx) callback,
35
55
{Duration ? lockTimeout, String ? debugContext}) {
36
- return mutex.lock (() => callback (SyncWriteContext (db)),
37
- timeout: lockTimeout);
56
+ final task = profileQueries ? TimelineTask () : null ;
57
+ task? .start ('${profilerPrefix }mutex_lock' );
58
+
59
+ return mutex.lock (
60
+ () {
61
+ task? .finish ();
62
+ return callback (SyncWriteContext (db, parent: task));
63
+ },
64
+ timeout: lockTimeout,
65
+ );
38
66
}
39
67
40
68
@override
@@ -53,9 +81,12 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
53
81
}
54
82
55
83
class SyncReadContext implements SqliteReadContext {
84
+ final TimelineTask ? task;
85
+
56
86
CommonDatabase db;
57
87
58
- SyncReadContext (this .db);
88
+ SyncReadContext (this .db, {TimelineTask ? parent})
89
+ : task = TimelineTask (parent: parent);
59
90
60
91
@override
61
92
Future <T > computeWithDatabase <T >(
@@ -65,13 +96,23 @@ class SyncReadContext implements SqliteReadContext {
65
96
66
97
@override
67
98
Future <Row > get (String sql, [List <Object ?> parameters = const []]) async {
68
- return db.select (sql, parameters).first;
99
+ return task.timeSync (
100
+ 'get' ,
101
+ () => db.select (sql, parameters).first,
102
+ sql: sql,
103
+ parameters: parameters,
104
+ );
69
105
}
70
106
71
107
@override
72
108
Future <ResultSet > getAll (String sql,
73
109
[List <Object ?> parameters = const []]) async {
74
- return db.select (sql, parameters);
110
+ return task.timeSync (
111
+ 'getAll' ,
112
+ () => db.select (sql, parameters),
113
+ sql: sql,
114
+ parameters: parameters,
115
+ );
75
116
}
76
117
77
118
@override
@@ -91,26 +132,32 @@ class SyncReadContext implements SqliteReadContext {
91
132
}
92
133
93
134
class SyncWriteContext extends SyncReadContext implements SqliteWriteContext {
94
- SyncWriteContext (super .db);
135
+ SyncWriteContext (super .db, { super .parent} );
95
136
96
137
@override
97
138
Future <ResultSet > execute (String sql,
98
139
[List <Object ?> parameters = const []]) async {
99
- return db.select (sql, parameters);
140
+ return task.timeSync (
141
+ 'execute' ,
142
+ () => db.select (sql, parameters),
143
+ sql: sql,
144
+ parameters: parameters,
145
+ );
100
146
}
101
147
102
148
@override
103
149
Future <void > executeBatch (
104
150
String sql, List <List <Object ?>> parameterSets) async {
105
- return computeWithDatabase ((db) async {
151
+ task. timeSync ( 'executeBatch' , () {
106
152
final statement = db.prepare (sql, checkNoTail: true );
107
153
try {
108
154
for (var parameters in parameterSets) {
109
- statement.execute (parameters);
155
+ task.timeSync ('iteration' , () => statement.execute (parameters),
156
+ parameters: parameters);
110
157
}
111
158
} finally {
112
159
statement.dispose ();
113
160
}
114
- });
161
+ }, sql : sql );
115
162
}
116
163
}
0 commit comments