mod database;
mod memory;
use anyhow::Result;
use database::Database;
use memory::Memory;
use r2d2::Pool;
use r2d2_sqlite::SqliteConnectionManager;
use std::{cell::RefCell, collections::HashMap};
pub struct Misc {
database: Database,
memory: RefCell<HashMap<String, Memory>>,
}
impl Misc {
pub fn init(database_pool: &Pool<SqliteConnectionManager>, profile_id: i64) -> Result<Self> {
let database = Database::init(database_pool, profile_id);
let rows = database.rows()?;
let memory = RefCell::new(HashMap::with_capacity(rows.len()));
{
let mut m = memory.borrow_mut();
let v = Memory::highlight_request_entry(true);
assert!(m.insert(v.key().to_string(), v).is_none());
for row in rows {
let v = Memory::from_db_row(&row.key, row.value).unwrap();
assert!(m.insert(v.key().to_string(), v).is_some());
}
}
Ok(Self { database, memory })
}
pub fn save(&self) -> Result<()> {
for (_, m) in self.memory.take() {
self.database.set(m.into_db_row())?;
}
Ok(())
}
pub fn set_highlight_request_entry(&self, value: bool) -> Option<Memory> {
let v = Memory::highlight_request_entry(value);
self.memory.borrow_mut().insert(v.key().to_string(), v)
}
pub fn is_highlight_request_entry(&self) -> bool {
if let Some(k) = self.memory.borrow().values().next() {
match k {
Memory::HighlightRequestEntry(v) => return v.is_true(),
}
}
false
}
}
pub fn migrate(tx: &sqlite::Transaction) -> Result<()> {
database::init(tx)?;
Ok(())
}