use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::{Arc, Mutex, OnceLock, Weak};
use crate::backend::SqliteBackendInner;
static REGISTRY: OnceLock<Mutex<HashMap<PathBuf, Weak<SqliteBackendInner>>>> =
OnceLock::new();
fn registry() -> &'static Mutex<HashMap<PathBuf, Weak<SqliteBackendInner>>> {
REGISTRY.get_or_init(|| Mutex::new(HashMap::new()))
}
fn lock_registry() -> std::sync::MutexGuard<'static, HashMap<PathBuf, Weak<SqliteBackendInner>>> {
registry()
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner())
}
pub(crate) fn lookup(key: &PathBuf) -> Option<Arc<SqliteBackendInner>> {
let guard = lock_registry();
guard.get(key).and_then(Weak::upgrade)
}
pub(crate) fn insert(
key: PathBuf,
inner: Arc<SqliteBackendInner>,
) -> Arc<SqliteBackendInner> {
let mut guard = lock_registry();
if let Some(existing) = guard.get(&key).and_then(Weak::upgrade) {
return existing;
}
guard.insert(key, Arc::downgrade(&inner));
inner
}