use std::collections::HashMap;
use std::sync::RwLock;
use crate::control::security::catalog::StoredSynonymGroup;
pub struct SynonymRegistry {
by_name: RwLock<HashMap<(u64, String), StoredSynonymGroup>>,
}
impl SynonymRegistry {
pub fn new() -> Self {
Self {
by_name: RwLock::new(HashMap::new()),
}
}
pub fn register(&self, def: StoredSynonymGroup) {
let key = (def.tenant_id, def.name.clone());
let mut map = self.by_name.write().unwrap_or_else(|p| p.into_inner());
map.insert(key, def);
}
pub fn unregister(&self, tenant_id: u64, name: &str) -> bool {
let key = (tenant_id, name.to_string());
let mut map = self.by_name.write().unwrap_or_else(|p| p.into_inner());
map.remove(&key).is_some()
}
pub fn exists(&self, tenant_id: u64, name: &str) -> bool {
let key = (tenant_id, name.to_string());
let map = self.by_name.read().unwrap_or_else(|p| p.into_inner());
map.contains_key(&key)
}
pub fn get(&self, tenant_id: u64, name: &str) -> Option<StoredSynonymGroup> {
let key = (tenant_id, name.to_string());
let map = self.by_name.read().unwrap_or_else(|p| p.into_inner());
map.get(&key).cloned()
}
pub fn list_for_tenant(&self, tenant_id: u64) -> Vec<StoredSynonymGroup> {
let map = self.by_name.read().unwrap_or_else(|p| p.into_inner());
map.values()
.filter(|g| g.tenant_id == tenant_id)
.cloned()
.collect()
}
pub fn reload_from_catalog(
&self,
catalog: &crate::control::security::catalog::SystemCatalog,
) -> crate::Result<()> {
let fresh = catalog.load_all_synonym_groups()?;
let mut map = self.by_name.write().unwrap_or_else(|p| p.into_inner());
map.clear();
for g in fresh {
let key = (g.tenant_id, g.name.clone());
map.insert(key, g);
}
Ok(())
}
}
impl Default for SynonymRegistry {
fn default() -> Self {
Self::new()
}
}