use std::sync::{Arc, Mutex}; use rusqlite::Connection; use rusqlite::OptionalExtension; #[derive(Debug, Clone)] pub struct UserdataStorage { pub connection: Arc>, } pub struct Userdata { pub user_id: String, pub secret_key: Vec, pub public_key: Vec, } impl UserdataStorage { pub fn new(connection: Arc>) -> Self { Self { connection } } pub fn get_user(&self) -> anyhow::Result> { let conn = self .connection .lock() .expect("Connection mutext is poisoned. It's a critical error. Exiting."); let res = conn .query_row( "SELECT user_id, secret_key, public_key FROM mls_cli_userdata", [], |row| { let user_id = row.get(0)?; let secret_key = row.get(1)?; let public_key = row.get(2)?; Ok(Userdata { user_id, secret_key, public_key, }) }, ) .optional()?; Ok(res) } pub fn truncate(&self) -> anyhow::Result<()> { let conn = self .connection .lock() .expect("Connection mutext is poisoned. It's a critical error. Exiting."); conn.execute("DELETE FROM mls_cli_userdata", [])?; Ok(()) } pub fn save_user( &self, user_id: &str, public_key: &[u8], secret_key: &[u8], ) -> anyhow::Result<()> { let conn = self .connection .lock() .expect("Connection mutext is poisoned. It's a critical error. Exiting."); conn.execute( "INSERT INTO mls_cli_userdata (user_id, secret_key, public_key) VALUES (?1, ?2, ?3)", rusqlite::params![user_id, secret_key, public_key], )?; Ok(()) } }