mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-29 01:25:33 +08:00
c3f2f0798d
Split the 1788-line database.rs into a well-organized module directory: - mod.rs (142 lines): Database struct and initialization - schema.rs (341 lines): Table creation and schema migrations - backup.rs (324 lines): SQL import/export and snapshot backup - migration.rs (240 lines): JSON to SQLite data migration - tests.rs (280 lines): Unit tests - dao/providers.rs (254 lines): Provider CRUD operations - dao/mcp.rs (97 lines): MCP server CRUD operations - dao/prompts.rs (88 lines): Prompt CRUD operations - dao/skills.rs (124 lines): Skills CRUD operations - dao/settings.rs (65 lines): Settings key-value storage Benefits: - Max file size reduced from 1788 to 341 lines - Clear separation of concerns (schema, backup, migration, DAOs) - Easier to navigate and maintain - All 107 tests passing with zero API changes
66 lines
2.0 KiB
Rust
66 lines
2.0 KiB
Rust
//! 通用设置数据访问对象
|
|
//!
|
|
//! 提供键值对形式的通用设置存储。
|
|
|
|
use crate::database::{lock_conn, Database};
|
|
use crate::error::AppError;
|
|
use rusqlite::params;
|
|
|
|
impl Database {
|
|
/// 获取设置值
|
|
pub fn get_setting(&self, key: &str) -> Result<Option<String>, 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<Option<String>, AppError> {
|
|
self.get_setting(&format!("common_config_{app_type}"))
|
|
}
|
|
|
|
/// 设置通用配置片段
|
|
pub fn set_config_snippet(
|
|
&self,
|
|
app_type: &str,
|
|
snippet: Option<String>,
|
|
) -> 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(())
|
|
}
|
|
}
|
|
}
|