diff options
Diffstat (limited to 'crates/rocie-server/src/storage/sql/insert/config')
| -rw-r--r-- | crates/rocie-server/src/storage/sql/insert/config/mod.rs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/crates/rocie-server/src/storage/sql/insert/config/mod.rs b/crates/rocie-server/src/storage/sql/insert/config/mod.rs new file mode 100644 index 0000000..8c81feb --- /dev/null +++ b/crates/rocie-server/src/storage/sql/insert/config/mod.rs @@ -0,0 +1,80 @@ +use serde::{Deserialize, Serialize}; +use sqlx::query; + +use crate::storage::sql::{ + config::Config, + insert::{Operations, Transactionable}, +}; + +#[derive(Debug, Deserialize, Serialize)] +pub(crate) enum Operation { + UseDefault { value: bool, old_value: bool }, +} + +impl Transactionable for Operation { + type ApplyError = apply::Error; + type UndoError = undo::Error; + + async fn apply(self, txn: &mut sqlx::SqliteConnection) -> Result<(), apply::Error> { + match self { + Operation::UseDefault { value, .. } => { + query!( + " + UPDATE config + SET use_defaults = ? + WHERE id = 0 +", + value, + ) + .execute(txn) + .await?; + } + } + Ok(()) + } + + async fn undo(self, txn: &mut sqlx::SqliteConnection) -> Result<(), undo::Error> { + match self { + Operation::UseDefault { old_value, .. } => { + query!( + " + UPDATE config + SET use_defaults = ? + WHERE id = 0 +", + old_value, + ) + .execute(txn) + .await?; + } + } + Ok(()) + } +} + +pub(crate) mod undo { + #[derive(thiserror::Error, Debug)] + pub(crate) enum Error { + #[error("Failed to execute undo sql statments: {0}")] + SqlError(#[from] sqlx::Error), + } +} +pub(crate) mod apply { + #[derive(thiserror::Error, Debug)] + pub(crate) enum Error { + #[error("Failed to execute apply sql statments: {0}")] + SqlError(#[from] sqlx::Error), + } +} + +impl Config { + pub(crate) fn set_use_default(&mut self, new_value: bool, ops: &mut Operations<Operation>) { + if self.should_use_defaults != new_value { + ops.push(Operation::UseDefault { + value: new_value, + old_value: self.should_use_defaults, + }); + self.should_use_defaults = new_value; + } + } +} |
