From 9ed576b5524563cedb78868e68ce59a8b8cb8517 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Thu, 2 May 2024 19:35:11 +0200 Subject: [PATCH] Revert "Add sql transactions" This caused the error "locked database". This reverts commit 4489b37a3fe2e7f81f3efc95e8008832c1d24256. --- Cargo.lock | Bin 69761 -> 67353 bytes src/app_state.rs | 5 ++--- src/main.rs | 29 ++++++++++++++--------------- src/ws/mod.rs | 47 ++++++++++++++++++++++++++--------------------- 4 files changed, 42 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3f48599ee033a9f2dec875686e0e9d6fa78816b0..d56fed76063d9a7b236399da692449a0a23fd52e 100644 GIT binary patch delta 12984 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 for AppState { fn handle(&mut self, _msg: Reload, _ctx: &mut Self::Context) -> Self::Result { log::debug!("Reloading controller"); - let mut tx = block_on(self.pool.begin())?; + let mut pool_conn = block_on(self.pool.acquire())?; - self.this.reload(&mut tx)?; - block_on(tx.commit())?; + self.this.reload(&mut pool_conn)?; self.notify_controller_change(); diff --git a/src/main.rs b/src/main.rs index d18fec0..1ba2d42 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ use emgauwa_common::models::{Controller, FromDbModel}; use emgauwa_common::types::EmgauwaUid; use emgauwa_common::utils::{drop_privileges, init_logging}; use rppal_pfd::PiFaceDigital; -use sqlx::Transaction; +use sqlx::pool::PoolConnection; use sqlx::Sqlite; use crate::relay_loop::run_relays_loop; @@ -21,11 +21,11 @@ mod utils; mod ws; async fn create_this_controller( - tx: &mut Transaction<'_, Sqlite>, + conn: &mut PoolConnection, settings: &Settings, ) -> Result { DbController::create( - tx, + conn, &EmgauwaUid::default(), &settings.name, settings.relays.len() as i64, @@ -35,12 +35,12 @@ async fn create_this_controller( } async fn create_this_relay( - tx: &mut Transaction<'_, Sqlite>, + conn: &mut PoolConnection, this_controller: &DbController, settings_relay: &settings::Relay, ) -> Result { let relay = DbRelay::create( - tx, + conn, &settings_relay.name, settings_relay.number.ok_or(EmgauwaError::Internal( "Relay number is missing".to_string(), @@ -49,9 +49,9 @@ async fn create_this_relay( ) .await?; - let off = DbSchedule::get_off(tx).await?; + let off = DbSchedule::get_off(conn).await?; for weekday in 0..7 { - DbJunctionRelaySchedule::set_schedule(tx, &relay, &off, weekday).await?; + DbJunctionRelaySchedule::set_schedule(conn, &relay, &off, weekday).await?; } Ok(relay) @@ -72,20 +72,20 @@ async fn main() -> Result<(), std::io::Error> { .await .map_err(EmgauwaError::from)?; - let mut tx = pool.begin().await.map_err(EmgauwaError::from)?; + let mut conn = pool.acquire().await.map_err(EmgauwaError::from)?; - let db_controller = match DbController::get_all(&mut tx) + let db_controller = match DbController::get_all(&mut conn) .await .map_err(EmgauwaError::from)? .pop() { - None => futures::executor::block_on(create_this_controller(&mut tx, &settings))?, + None => futures::executor::block_on(create_this_controller(&mut conn, &settings))?, Some(c) => c, }; for relay in &settings.relays { if DbRelay::get_by_controller_and_num( - &mut tx, + &mut conn, &db_controller, relay.number.ok_or(EmgauwaError::Internal( "Relay number is missing".to_string(), @@ -95,19 +95,18 @@ async fn main() -> Result<(), std::io::Error> { .map_err(EmgauwaError::from)? .is_none() { - create_this_relay(&mut tx, &db_controller, relay) + create_this_relay(&mut conn, &db_controller, relay) .await .map_err(EmgauwaError::from)?; } } let db_controller = db_controller - .update(&mut tx, &db_controller.name, settings.relays.len() as i64) + .update(&mut conn, &db_controller.name, settings.relays.len() as i64) .await .map_err(EmgauwaError::from)?; - let this = Controller::from_db_model(&mut tx, db_controller).map_err(EmgauwaError::from)?; - tx.commit().await.map_err(EmgauwaError::from)?; + let this = Controller::from_db_model(&mut conn, db_controller).map_err(EmgauwaError::from)?; let url = format!( "ws://{}:{}/api/v1/ws/controllers", diff --git a/src/ws/mod.rs b/src/ws/mod.rs index cf496c1..994cec6 100644 --- a/src/ws/mod.rs +++ b/src/ws/mod.rs @@ -5,7 +5,7 @@ use emgauwa_common::errors::{DatabaseError, EmgauwaError}; use emgauwa_common::models::{Controller, Relay}; use emgauwa_common::types::{ControllerWsAction, ScheduleUid}; use futures::{future, pin_mut, SinkExt, StreamExt}; -use sqlx::Transaction; +use sqlx::pool::PoolConnection; use sqlx::{Pool, Sqlite}; use tokio::time; use tokio_tungstenite::tungstenite::Message; @@ -108,7 +108,14 @@ async fn handle_message( match serde_json::from_str(&text) { Ok(action) => { log::debug!("Received action: {:?}", action); - let action_res = handle_action(pool, app_state, action).await; + let mut pool_conn = match pool.acquire().await { + Ok(conn) => conn, + Err(err) => { + log::error!("Failed to acquire database connection: {:?}", err); + return; + } + }; + let action_res = handle_action(&mut pool_conn, app_state, action).await; if let Err(e) = action_res { log::error!("Error handling action: {:?}", e); } @@ -121,31 +128,29 @@ async fn handle_message( } pub async fn handle_action( - pool: Pool, + conn: &mut PoolConnection, app_state: &Addr, action: ControllerWsAction, ) -> Result<(), EmgauwaError> { let this = app_state_get_this(app_state).await?; - let mut tx = pool.begin().await?; match action { ControllerWsAction::Controller(controller) => { - handle_controller(&mut tx, &this, controller).await? + handle_controller(conn, &this, controller).await? } - ControllerWsAction::Relays(relays) => handle_relays(&mut tx, &this, relays).await?, - ControllerWsAction::Schedules(schedules) => handle_schedules(&mut tx, schedules).await?, + ControllerWsAction::Relays(relays) => handle_relays(conn, &this, relays).await?, + ControllerWsAction::Schedules(schedules) => handle_schedules(conn, schedules).await?, ControllerWsAction::RelayPulse((relay_num, duration)) => { handle_relay_pulse(app_state, relay_num, duration).await? } _ => return Ok(()), }; - tx.commit().await?; utils::app_state_reload(app_state).await } async fn handle_controller( - tx: &mut Transaction<'_, Sqlite>, + conn: &mut PoolConnection, this: &Controller, controller: Controller, ) -> Result<(), EmgauwaError> { @@ -154,17 +159,17 @@ async fn handle_controller( "Controller UID mismatch during update", ))); } - DbController::get_by_uid(tx, &controller.c.uid) + DbController::get_by_uid(conn, &controller.c.uid) .await? .ok_or(DatabaseError::NotFound)? - .update(tx, controller.c.name.as_str(), this.c.relay_count) + .update(conn, controller.c.name.as_str(), this.c.relay_count) .await?; Ok(()) } async fn handle_schedules( - tx: &mut Transaction<'_, Sqlite>, + conn: &mut PoolConnection, schedules: Vec, ) -> Result<(), EmgauwaError> { let mut handled_uids = vec![ @@ -179,15 +184,15 @@ async fn handle_schedules( handled_uids.push(schedule.uid.clone()); log::debug!("Handling schedule: {:?}", schedule); - let schedule_db = DbSchedule::get_by_uid(tx, &schedule.uid).await?; + let schedule_db = DbSchedule::get_by_uid(conn, &schedule.uid).await?; if let Some(schedule_db) = schedule_db { schedule_db - .update(tx, schedule.name.as_str(), &schedule.periods) + .update(conn, schedule.name.as_str(), &schedule.periods) .await?; } else { DbSchedule::create( - tx, + conn, schedule.uid.clone(), schedule.name.as_str(), &schedule.periods, @@ -200,7 +205,7 @@ async fn handle_schedules( } async fn handle_relays( - tx: &mut Transaction<'_, Sqlite>, + conn: &mut PoolConnection, this: &Controller, relays: Vec, ) -> Result<(), EmgauwaError> { @@ -210,24 +215,24 @@ async fn handle_relays( "Controller UID mismatch during relay update", ))); } - let db_relay = DbRelay::get_by_controller_and_num(tx, &this.c, relay.r.number) + let db_relay = DbRelay::get_by_controller_and_num(conn, &this.c, relay.r.number) .await? .ok_or(DatabaseError::NotFound)?; - db_relay.update(tx, relay.r.name.as_str()).await?; + db_relay.update(conn, relay.r.name.as_str()).await?; - handle_schedules(tx, relay.schedules.clone()).await?; + handle_schedules(conn, relay.schedules.clone()).await?; let mut schedules = Vec::new(); // We need to get the schedules from the database to have the right IDs for schedule in relay.schedules { schedules.push( - DbSchedule::get_by_uid(tx, &schedule.uid) + DbSchedule::get_by_uid(conn, &schedule.uid) .await? .ok_or(DatabaseError::NotFound)?, ); } - DbJunctionRelaySchedule::set_schedules(tx, &db_relay, schedules.iter().collect()).await?; + DbJunctionRelaySchedule::set_schedules(conn, &db_relay, schedules.iter().collect()).await?; } Ok(())