@@ -7,6 +7,7 @@ use r2d2_sqlite::SqliteConnectionManager;
77use rusqlite:: types:: ToSql ;
88use rusqlite:: { Connection , Row , Transaction } ;
99use std:: sync:: Arc ;
10+ use std:: time:: Instant ;
1011use tempfile:: NamedTempFile ;
1112
1213static LEGACY_DATABASE_PATHS : & [ & str ] = & [ "server.db" ] ;
@@ -119,16 +120,20 @@ pub trait QueryUtils {
119120
120121 fn exists ( & self , sql : & str , params : & [ & ToSql ] ) -> Fallible < bool > {
121122 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+ } )
124127 } )
125128 }
126129
127130 fn execute ( & self , sql : & str , params : & [ & ToSql ] ) -> Fallible < usize > {
128131 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+ } )
132137 } )
133138 }
134139
@@ -139,14 +144,16 @@ pub trait QueryUtils {
139144 func : F ,
140145 ) -> Fallible < Option < T > > {
141146 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+ } )
150157 } )
151158 }
152159
@@ -157,17 +164,26 @@ pub trait QueryUtils {
157164 func : F ,
158165 ) -> Fallible < Vec < T > > {
159166 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) ?;
162170
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+ }
167175
168- Ok ( results)
176+ Ok ( results)
177+ } )
169178 } )
170179 }
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+ }
171187}
172188
173189impl QueryUtils for Database {
0 commit comments