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' ;
4
6
import 'package:sqlite_async/src/sqlite_queries.dart' ;
5
7
import 'package:sqlite_async/src/update_notification.dart' ;
8
+ import 'package:sqlite_async/src/utils/profiler.dart' ;
6
9
7
10
/// A simple "synchronous" connection which provides the async SqliteConnection
8
11
/// implementation using a synchronous SQLite connection
@@ -14,7 +17,12 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
14
17
15
18
bool _closed = false ;
16
19
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 }) {
18
26
mutex = m.open ();
19
27
updates = db.updates.map (
20
28
(event) {
@@ -26,15 +34,31 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
26
34
@override
27
35
Future <T > readLock <T >(Future <T > Function (SqliteReadContext tx) callback,
28
36
{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
+ );
31
47
}
32
48
33
49
@override
34
50
Future <T > writeLock <T >(Future <T > Function (SqliteWriteContext tx) callback,
35
51
{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
+ );
38
62
}
39
63
40
64
@override
@@ -53,9 +77,12 @@ class SyncSqliteConnection extends SqliteConnection with SqliteQueries {
53
77
}
54
78
55
79
class SyncReadContext implements SqliteReadContext {
80
+ final TimelineTask ? task;
81
+
56
82
CommonDatabase db;
57
83
58
- SyncReadContext (this .db);
84
+ SyncReadContext (this .db, {TimelineTask ? parent})
85
+ : task = TimelineTask (parent: parent);
59
86
60
87
@override
61
88
Future <T > computeWithDatabase <T >(
@@ -65,13 +92,21 @@ class SyncReadContext implements SqliteReadContext {
65
92
66
93
@override
67
94
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
+ );
69
100
}
70
101
71
102
@override
72
103
Future <ResultSet > getAll (String sql,
73
104
[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
+ );
75
110
}
76
111
77
112
@override
@@ -91,26 +126,31 @@ class SyncReadContext implements SqliteReadContext {
91
126
}
92
127
93
128
class SyncWriteContext extends SyncReadContext implements SqliteWriteContext {
94
- SyncWriteContext (super .db);
129
+ SyncWriteContext (super .db, { super .parent} );
95
130
96
131
@override
97
132
Future <ResultSet > execute (String sql,
98
133
[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
+ );
100
139
}
101
140
102
141
@override
103
142
Future <void > executeBatch (
104
143
String sql, List <List <Object ?>> parameterSets) async {
105
- return computeWithDatabase ((db) async {
144
+ task. timeSync ( 'executeBatch' , () {
106
145
final statement = db.prepare (sql, checkNoTail: true );
107
146
try {
108
147
for (var parameters in parameterSets) {
109
- statement.execute (parameters);
148
+ task.timeSync ('iteration' , () => statement.execute (parameters),
149
+ arguments: parameterArgs (parameters));
110
150
}
111
151
} finally {
112
152
statement.dispose ();
113
153
}
114
- });
154
+ }, arguments : { 'sql' : sql} );
115
155
}
116
156
}
0 commit comments