//! 通用设置数据访问对象 //! //! 提供键值对形式的通用设置存储。 use crate::database::{lock_conn, Database}; use crate::error::AppError; use rusqlite::params; impl Database { /// 获取设置值 pub fn get_setting(&self, key: &str) -> Result, AppError> { let conn = lock_conn!(self.conn); let mut stmt = conn .prepare("SELECT value FROM settings WHERE key = ?1") .map_err(|e| AppError::Database(e.to_string()))?; let mut rows = stmt .query(params![key]) .map_err(|e| AppError::Database(e.to_string()))?; if let Some(row) = rows.next().map_err(|e| AppError::Database(e.to_string()))? { Ok(Some( row.get(0).map_err(|e| AppError::Database(e.to_string()))?, )) } else { Ok(None) } } /// 设置值 pub fn set_setting(&self, key: &str, value: &str) -> Result<(), AppError> { let conn = lock_conn!(self.conn); conn.execute( "INSERT OR REPLACE INTO settings (key, value) VALUES (?1, ?2)", params![key, value], ) .map_err(|e| AppError::Database(e.to_string()))?; Ok(()) } // --- Config Snippets 辅助方法 --- /// 获取通用配置片段 pub fn get_config_snippet(&self, app_type: &str) -> Result, AppError> { self.get_setting(&format!("common_config_{app_type}")) } /// 设置通用配置片段 pub fn set_config_snippet( &self, app_type: &str, snippet: Option, ) -> Result<(), AppError> { let key = format!("common_config_{app_type}"); if let Some(value) = snippet { self.set_setting(&key, &value) } else { // 如果为 None 则删除 let conn = lock_conn!(self.conn); conn.execute("DELETE FROM settings WHERE key = ?1", params![key]) .map_err(|e| AppError::Database(e.to_string()))?; Ok(()) } } }