@@ -34,10 +34,15 @@ use crate::{
34
34
tui,
35
35
} ;
36
36
37
+ pub enum QueryTask {
38
+ Query ( tokio:: task:: JoinHandle < QueryResultsWithMetadata > ) ,
39
+ Tx ( tokio:: task:: JoinHandle < QueryResultsWithMetadata > ) ,
40
+ }
41
+
37
42
pub struct AppState {
38
43
pub connection_string : String ,
39
44
pub focus : Focus ,
40
- pub query_task : Option < tokio :: task :: JoinHandle < QueryResultsWithMetadata > > ,
45
+ pub query_task : Option < QueryTask > ,
41
46
}
42
47
43
48
pub struct Components < ' a > {
@@ -119,7 +124,7 @@ impl App {
119
124
if query_task. is_finished ( ) {
120
125
let results = query_task. await ?;
121
126
self . state . query_task = None ;
122
- self . components . data . set_data_state ( Some ( results. results ) , results. statement_type ) ;
127
+ self . components . data . set_data_state ( Some ( results. results ) , Some ( results. statement_type ) ) ;
123
128
}
124
129
}
125
130
if let Some ( e) = tui. next ( ) . await {
@@ -225,23 +230,32 @@ impl App {
225
230
let should_use_tx = database:: should_use_tx ( & query) ;
226
231
let action_tx = action_tx. clone ( ) ;
227
232
if let Some ( pool) = & self . pool {
228
- let pool = pool. clone ( ) ;
229
- self . components . data . set_loading ( ) ;
230
- self . state . query_task = Some ( tokio:: spawn ( async move {
231
- log:: info!( "Query: {}" , query) ;
232
- let results = database:: query ( query. clone ( ) , & pool) . await ;
233
- match & results {
234
- Ok ( rows) => {
235
- log:: info!( "{:?} rows, {:?} affected" , rows. 0 . len( ) , rows. 1 ) ;
236
- } ,
237
- Err ( e) => {
238
- log:: error!( "{e:?}" ) ;
239
- } ,
240
- } ;
241
- let statement_type = database:: get_statement_type ( & query) . unwrap ( ) ;
233
+ match should_use_tx {
234
+ Ok ( true ) => { } ,
235
+ Ok ( false ) => {
236
+ let pool = pool. clone ( ) ;
237
+ self . components . data . set_loading ( ) ;
238
+ self . state . query_task = Some ( tokio:: spawn ( async move {
239
+ log:: info!( "Query: {}" , query) ;
240
+ let results = database:: query ( query. clone ( ) , & pool) . await ;
241
+ match & results {
242
+ Ok ( rows) => {
243
+ log:: info!( "{:?} rows, {:?} affected" , rows. 0 . len( ) , rows. 1 ) ;
244
+ } ,
245
+ Err ( e) => {
246
+ log:: error!( "{e:?}" ) ;
247
+ } ,
248
+ } ;
249
+ let statement_type = database:: get_statement_type ( & query) . unwrap ( ) ;
242
250
243
- QueryResultsWithMetadata { results, statement_type }
244
- } ) ) ;
251
+ QueryResultsWithMetadata { results, statement_type }
252
+ } ) ) ;
253
+ } ,
254
+ Err ( e) => self . components . data . set_data_state ( Some ( Err ( e) ) , None ) ,
255
+ }
256
+ } else {
257
+ log:: error!( "No connection pool" ) ;
258
+ self . components . data . set_data_state ( Some ( Err ( DbError :: Left ( sqlx:: Error :: PoolTimedOut ) ) ) , None )
245
259
}
246
260
} ,
247
261
Action :: AbortQuery => {
0 commit comments