@@ -7,6 +7,7 @@ use r2d2_sqlite::SqliteConnectionManager;
7
7
use rusqlite:: types:: ToSql ;
8
8
use rusqlite:: { Connection , Row , Transaction } ;
9
9
use std:: sync:: Arc ;
10
+ use std:: time:: Instant ;
10
11
use tempfile:: NamedTempFile ;
11
12
12
13
static LEGACY_DATABASE_PATHS : & [ & str ] = & [ "server.db" ] ;
@@ -119,16 +120,20 @@ pub trait QueryUtils {
119
120
120
121
fn exists ( & self , sql : & str , params : & [ & ToSql ] ) -> Fallible < bool > {
121
122
self . with_conn ( |conn| {
122
- let mut prepared = conn. prepare ( sql) ?;
123
- Ok ( prepared. exists ( params) ?)
123
+ self . trace ( sql, || {
124
+ let mut prepared = conn. prepare ( sql) ?;
125
+ Ok ( prepared. exists ( params) ?)
126
+ } )
124
127
} )
125
128
}
126
129
127
130
fn execute ( & self , sql : & str , params : & [ & ToSql ] ) -> Fallible < usize > {
128
131
self . with_conn ( |conn| {
129
- let mut prepared = conn. prepare ( sql) ?;
130
- let changes = prepared. execute ( params) ?;
131
- Ok ( changes)
132
+ self . trace ( sql, || {
133
+ let mut prepared = conn. prepare ( sql) ?;
134
+ let changes = prepared. execute ( params) ?;
135
+ Ok ( changes)
136
+ } )
132
137
} )
133
138
}
134
139
@@ -139,14 +144,16 @@ pub trait QueryUtils {
139
144
func : F ,
140
145
) -> Fallible < Option < T > > {
141
146
self . with_conn ( |conn| {
142
- let mut prepared = conn. prepare ( sql) ?;
143
- let mut iter = prepared. query_map ( params, func) ?;
144
-
145
- if let Some ( item) = iter. next ( ) {
146
- Ok ( Some ( item?) )
147
- } else {
148
- Ok ( None )
149
- }
147
+ self . trace ( sql, || {
148
+ let mut prepared = conn. prepare ( sql) ?;
149
+ let mut iter = prepared. query_map ( params, func) ?;
150
+
151
+ if let Some ( item) = iter. next ( ) {
152
+ Ok ( Some ( item?) )
153
+ } else {
154
+ Ok ( None )
155
+ }
156
+ } )
150
157
} )
151
158
}
152
159
@@ -157,17 +164,26 @@ pub trait QueryUtils {
157
164
func : F ,
158
165
) -> Fallible < Vec < T > > {
159
166
self . with_conn ( |conn| {
160
- let mut prepared = conn. prepare ( sql) ?;
161
- let rows = prepared. query_map ( params, func) ?;
167
+ self . trace ( sql, || {
168
+ let mut prepared = conn. prepare ( sql) ?;
169
+ let rows = prepared. query_map ( params, func) ?;
162
170
163
- let mut results = Vec :: new ( ) ;
164
- for row in rows {
165
- results. push ( row?) ;
166
- }
171
+ let mut results = Vec :: new ( ) ;
172
+ for row in rows {
173
+ results. push ( row?) ;
174
+ }
167
175
168
- Ok ( results)
176
+ Ok ( results)
177
+ } )
169
178
} )
170
179
}
180
+
181
+ fn trace < T , F : FnOnce ( ) -> T > ( & self , sql : & str , f : F ) -> T {
182
+ let start = Instant :: now ( ) ;
183
+ let res = f ( ) ;
184
+ trace ! ( "sql query \" {}\" executed in {:?}" , sql, start. elapsed( ) ) ;
185
+ res
186
+ }
171
187
}
172
188
173
189
impl QueryUtils for Database {
0 commit comments