use std::collections::HashMap;
use std::sync::RwLock;
use nodedb_types::{AuditDmlMode, DatabaseId};
use crate::control::security::catalog::SystemCatalog;
pub struct AuditDmlCache {
inner: RwLock<HashMap<DatabaseId, AuditDmlMode>>,
}
impl AuditDmlCache {
pub fn new() -> Self {
Self {
inner: RwLock::new(HashMap::new()),
}
}
pub fn get(&self, db_id: DatabaseId) -> AuditDmlMode {
self.inner
.read()
.unwrap_or_else(|p| p.into_inner())
.get(&db_id)
.copied()
.unwrap_or(AuditDmlMode::None)
}
pub fn set(&self, db_id: DatabaseId, mode: AuditDmlMode) {
self.inner
.write()
.unwrap_or_else(|p| p.into_inner())
.insert(db_id, mode);
}
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.audit_dml != AuditDmlMode::None {
map.insert(descriptor.id, descriptor.audit_dml);
}
}
Ok(())
}
}
impl Default for AuditDmlCache {
fn default() -> Self {
Self::new()
}
}