use std::collections::HashMap;
use std::sync::RwLock;
use nodedb_types::DatabaseId;
use crate::control::security::catalog::SystemCatalog;
pub struct IdleTimeoutCache {
inner: RwLock<HashMap<DatabaseId, u64>>,
}
impl IdleTimeoutCache {
pub fn new() -> Self {
Self {
inner: RwLock::new(HashMap::new()),
}
}
pub fn get(&self, db_id: DatabaseId) -> u64 {
self.inner
.read()
.unwrap_or_else(|p| p.into_inner())
.get(&db_id)
.copied()
.unwrap_or(0)
}
pub fn set(&self, db_id: DatabaseId, secs: u64) {
let mut map = self.inner.write().unwrap_or_else(|p| p.into_inner());
if secs == 0 {
map.remove(&db_id);
} else {
map.insert(db_id, secs);
}
}
pub fn load_from_catalog(&self, catalog: &SystemCatalog) -> crate::Result<()> {
let databases = catalog.list_databases()?;
let mut map = self.inner.write().unwrap_or_else(|p| p.into_inner());
for descriptor in databases {
if descriptor.idle_session_timeout_secs > 0 {
map.insert(descriptor.id, descriptor.idle_session_timeout_secs);
}
}
Ok(())
}
}
impl Default for IdleTimeoutCache {
fn default() -> Self {
Self::new()
}
}