game_manager_lib\database/
configs.rs

1//! Módulo para gerenciamento genérico de configurações da aplicação.
2//!
3//! Permite definir e buscar configurações chave-valor na tabela `app_config`.
4//! A tabela é criada automaticamente se não existir.
5//! As funções retornam erros apropriados em caso de falhas de banco de dados.
6
7use crate::database::AppState;
8use crate::errors::AppError;
9use rusqlite::{params, Connection};
10use tauri::{AppHandle, Manager, State};
11
12// === GERENCIAMENTO GENÉRICO DE CONFIGURAÇÃO (app_config) ===
13
14/// Cria a tabela app_config se não existir (Idempotente)
15fn ensure_config_table(conn: &Connection) -> Result<(), AppError> {
16    conn.execute(
17        "CREATE TABLE IF NOT EXISTS app_config (
18            key TEXT PRIMARY KEY,
19            value TEXT NOT NULL
20        )",
21        [],
22    )
23    .map_err(|e| AppError::DatabaseError(e.to_string()))?;
24    Ok(())
25}
26
27/// Define uma configuração (Upsert)
28pub fn set_config(conn: &Connection, key: &str, value: &str) -> Result<(), AppError> {
29    ensure_config_table(conn)?;
30    conn.execute(
31        "INSERT OR REPLACE INTO app_config (key, value) VALUES (?1, ?2)",
32        params![key, value],
33    )
34    .map_err(|e| AppError::DatabaseError(e.to_string()))?;
35    Ok(())
36}
37
38/// Busca uma configuração (Option)
39pub fn get_config(conn: &Connection, key: &str) -> Result<Option<String>, AppError> {
40    ensure_config_table(conn)?;
41    let res: Result<String, rusqlite::Error> = conn.query_row(
42        "SELECT value FROM app_config WHERE key = ?1",
43        params![key],
44        |row| row.get(0),
45    );
46
47    match res {
48        Ok(val) => Ok(Some(val)),
49        Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None),
50        Err(e) => Err(AppError::DatabaseError(e.to_string())),
51    }
52}
53
54// === STORAGE DE VERSÃO DA APLICAÇÃO ===
55
56/// Armazena a versão atual da aplicação no banco de metadados
57pub fn store_app_version(app: &AppHandle, version: &str) -> Result<(), AppError> {
58    let state: State<AppState> = app.state();
59    let conn = state.metadata_db.lock().map_err(|_| AppError::MutexError)?;
60
61    ensure_config_table(&conn)?;
62
63    conn.execute(
64        "INSERT OR REPLACE INTO app_config (key, value) VALUES ('app_version', ?1)",
65        params![version],
66    )?;
67
68    Ok(())
69}
70
71/// Obtém a versão armazenada da aplicação do banco de metadados
72pub fn get_stored_app_version(app: &AppHandle) -> Result<String, AppError> {
73    let state: State<AppState> = app.state();
74    let conn = state.metadata_db.lock().map_err(|_| AppError::MutexError)?;
75
76    ensure_config_table(&conn)?;
77
78    match conn.query_row(
79        "SELECT value FROM app_config WHERE key = 'app_version'",
80        [],
81        |row| row.get::<_, String>(0),
82    ) {
83        Ok(version) => Ok(version),
84        Err(rusqlite::Error::QueryReturnedNoRows) => Ok("0.0.0".to_string()),
85        Err(e) => Err(AppError::DatabaseError(e.to_string())),
86    }
87}
88
89// === STORAGE DE VERSÃO DO SCHEMA ===
90
91/// Armazena a versão do schema no banco de metadados
92pub fn store_schema_version(app: &AppHandle, schema_version: u32) -> Result<(), AppError> {
93    let state: State<AppState> = app.state();
94    let conn = state.metadata_db.lock().map_err(|_| AppError::MutexError)?;
95
96    ensure_config_table(&conn)?;
97
98    conn.execute(
99        "INSERT OR REPLACE INTO app_config (key, value) VALUES ('schema_version', ?1)",
100        params![schema_version],
101    )?;
102
103    Ok(())
104}
105
106/// Obtém a versão do schema armazenada do banco de metadados
107pub fn get_stored_schema_version(app: &AppHandle) -> Result<u32, AppError> {
108    let state: State<AppState> = app.state();
109    let conn = state.metadata_db.lock().map_err(|_| AppError::MutexError)?;
110
111    ensure_config_table(&conn)?;
112
113    match conn.query_row(
114        "SELECT value FROM app_config WHERE key = 'schema_version'",
115        [],
116        |row| row.get::<_, String>(0),
117    ) {
118        Ok(version_str) => version_str.parse::<u32>().map_err(|e| {
119            AppError::DatabaseError(format!("Erro ao converter schema_version: {}", e))
120        }),
121        Err(rusqlite::Error::QueryReturnedNoRows) => Ok(0),
122        Err(e) => Err(AppError::DatabaseError(e.to_string())),
123    }
124}