use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use nodedb_types::DatabaseId;
use crate::types::TenantId;
type Key = (TenantId, Arc<str>);
pub struct CollectionToDatabase {
inner: RwLock<HashMap<Key, DatabaseId>>,
}
impl CollectionToDatabase {
pub fn new() -> Self {
Self {
inner: RwLock::new(HashMap::new()),
}
}
pub fn lookup(&self, tenant_id: TenantId, collection: &str) -> Option<DatabaseId> {
self.inner
.read()
.unwrap_or_else(|p| p.into_inner())
.get(&(tenant_id, Arc::from(collection)))
.copied()
}
pub fn insert(&self, tenant_id: TenantId, collection: Arc<str>, db_id: DatabaseId) {
self.inner
.write()
.unwrap_or_else(|p| p.into_inner())
.insert((tenant_id, collection), db_id);
}
pub fn remove(&self, tenant_id: TenantId, collection: &str) {
self.inner
.write()
.unwrap_or_else(|p| p.into_inner())
.remove(&(tenant_id, Arc::from(collection)));
}
pub fn load_from_catalog(
&self,
catalog: &crate::control::security::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 {
let collections = catalog.load_all_collections(descriptor.id)?;
for collection in collections {
let tenant_id = TenantId::new(collection.tenant_id);
map.insert(
(tenant_id, Arc::from(collection.name.as_str())),
descriptor.id,
);
}
}
Ok(())
}
}
impl Default for CollectionToDatabase {
fn default() -> Self {
Self::new()
}
}