From 4aab08e6f080660ac7ee88c5347dd60666f934ce Mon Sep 17 00:00:00 2001 From: Joseph Montanaro Date: Wed, 26 Apr 2023 15:49:08 -0700 Subject: [PATCH] save settings to db --- .../migrations/20221201002355_initial.sql | 2 +- src-tauri/src/config.rs | 34 ++++++++++++++----- src-tauri/src/ipc.rs | 7 ++-- src-tauri/src/state.rs | 13 ++++++- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src-tauri/migrations/20221201002355_initial.sql b/src-tauri/migrations/20221201002355_initial.sql index 0052a6c..1a5636d 100644 --- a/src-tauri/migrations/20221201002355_initial.sql +++ b/src-tauri/migrations/20221201002355_initial.sql @@ -8,7 +8,7 @@ CREATE TABLE credentials ( ); CREATE TABLE config ( - name TEXT NOT NULL, + name TEXT UNIQUE NOT NULL, data TEXT NOT NULL ); diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 14091cc..3d2baec 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -32,17 +32,33 @@ impl Default for AppConfig { } -pub async fn load(pool: &SqlitePool) -> Result { - let res = sqlx::query!("SELECT * from config where name = 'main'") - .fetch_optional(pool) - .await?; +impl AppConfig { + pub async fn load(pool: &SqlitePool) -> Result { + let res = sqlx::query!("SELECT * from config where name = 'main'") + .fetch_optional(pool) + .await?; - let row = match res { - Some(row) => row, - None => return Ok(AppConfig::default()), - }; + let row = match res { + Some(row) => row, + None => return Ok(AppConfig::default()), + }; - Ok(serde_json::from_str(&row.data)?) + Ok(serde_json::from_str(&row.data)?) + } + + pub async fn save(&self, pool: &SqlitePool) -> Result<(), sqlx::error::Error> { + let data = serde_json::to_string(self).unwrap(); + sqlx::query( + "INSERT INTO config (name, data) VALUES ('main', ?) + ON CONFLICT (name) DO UPDATE SET data = ?" + ) + .bind(&data) + .bind(&data) + .execute(pool) + .await?; + + Ok(()) + } } diff --git a/src-tauri/src/ipc.rs b/src-tauri/src/ipc.rs index a5e91de..555f0c2 100644 --- a/src-tauri/src/ipc.rs +++ b/src-tauri/src/ipc.rs @@ -70,7 +70,8 @@ pub fn get_config(app_state: State<'_, AppState>) -> AppConfig { #[tauri::command] -pub fn save_config(config: AppConfig, app_state: State<'_, AppState>) { - let mut prev_config = app_state.config.write().unwrap(); - *prev_config = config; +pub async fn save_config(config: AppConfig, app_state: State<'_, AppState>) -> Result<(), String> { + app_state.update_config(config) + .await + .map_err(|e| format!("Error saving config to database: {e}")) } diff --git a/src-tauri/src/state.rs b/src-tauri/src/state.rs index c9daed9..c4debf6 100644 --- a/src-tauri/src/state.rs +++ b/src-tauri/src/state.rs @@ -76,7 +76,7 @@ impl AppState { let pool: SqlitePool = pool_opts.connect_with(conn_opts).await?; sqlx::migrate!().run(&pool).await?; let creds = Self::load_creds(&pool).await?; - let conf = config::load(&pool).await?; + let conf = AppConfig::load(&pool).await?; let state = AppState { config: RwLock::new(conf), @@ -150,6 +150,17 @@ impl AppState { Ok(()) } + pub async fn update_config(&self, new_config: AppConfig) -> Result<(), sqlx::error::Error> { + let config = { + let mut live_config = self.config.write().unwrap(); + *live_config = new_config; + live_config.clone() + }; + config.save(&self.pool).await?; + + Ok(()) + } + pub fn register_request(&self, chan: Sender) -> u64 { let count = { let mut c = self.request_count.write().unwrap();