Skip to content

Commit 91245a3

Browse files
wip tx
1 parent dc8f2c9 commit 91245a3

File tree

2 files changed

+37
-22
lines changed

2 files changed

+37
-22
lines changed

src/app.rs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,15 @@ use crate::{
3434
tui,
3535
};
3636

37+
pub enum QueryTask {
38+
Query(tokio::task::JoinHandle<QueryResultsWithMetadata>),
39+
Tx(tokio::task::JoinHandle<QueryResultsWithMetadata>),
40+
}
41+
3742
pub struct AppState {
3843
pub connection_string: String,
3944
pub focus: Focus,
40-
pub query_task: Option<tokio::task::JoinHandle<QueryResultsWithMetadata>>,
45+
pub query_task: Option<QueryTask>,
4146
}
4247

4348
pub struct Components<'a> {
@@ -119,7 +124,7 @@ impl App {
119124
if query_task.is_finished() {
120125
let results = query_task.await?;
121126
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));
123128
}
124129
}
125130
if let Some(e) = tui.next().await {
@@ -225,23 +230,32 @@ impl App {
225230
let should_use_tx = database::should_use_tx(&query);
226231
let action_tx = action_tx.clone();
227232
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();
242250

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)
245259
}
246260
},
247261
Action::AbortQuery => {

src/components/data.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub enum DataState {
3535
}
3636

3737
pub trait SettableDataTable<'a> {
38-
fn set_data_state(&mut self, data: Option<Result<Rows, DbError>>, statement_type: Statement);
38+
fn set_data_state(&mut self, data: Option<Result<Rows, DbError>>, statement_type: Option<Statement>);
3939
fn set_loading(&mut self);
4040
fn set_cancelled(&mut self);
4141
}
@@ -65,13 +65,14 @@ impl<'a> Data<'a> {
6565
}
6666

6767
impl<'a> SettableDataTable<'a> for Data<'a> {
68-
fn set_data_state(&mut self, data: Option<Result<Rows, DbError>>, statement_type: Statement) {
68+
fn set_data_state(&mut self, data: Option<Result<Rows, DbError>>, statement_type: Option<Statement>) {
6969
match data {
7070
Some(Ok(rows)) => {
7171
if rows.0.is_empty() && rows.1.is_some_and(|n| n > 0) {
7272
self.data_state = DataState::RowsAffected(rows.1.unwrap());
73-
} else if rows.0.is_empty() && !matches!(statement_type, Statement::Query(_)) {
74-
self.data_state = DataState::StatementCompleted(statement_type);
73+
} else if rows.0.is_empty() && statement_type.is_some() && !matches!(statement_type, Some(Statement::Query(_)))
74+
{
75+
self.data_state = DataState::StatementCompleted(statement_type.unwrap());
7576
} else if rows.0.is_empty() {
7677
self.data_state = DataState::NoResults;
7778
} else {

0 commit comments

Comments
 (0)