use std::collections::HashMap;
use std::sync::{Mutex, OnceLock};
use bb8::Pool;
use bb8_tiberius::ConnectionManager;
pub type SqlPool = Pool<ConnectionManager>;
pub async fn cached_pool(
cache_key: &str,
config: tiberius::Config,
max_size: u32,
) -> anyhow::Result<SqlPool> {
static POOLS: OnceLock<Mutex<HashMap<String, SqlPool>>> = OnceLock::new();
let pools = POOLS.get_or_init(|| Mutex::new(HashMap::new()));
if let Some(pool) = pools.lock().unwrap().get(cache_key) {
return Ok(pool.clone());
}
let manager = ConnectionManager::new(config);
let pool = Pool::builder().max_size(max_size).build(manager).await?;
let mut pools = pools.lock().unwrap();
Ok(pools.entry(cache_key.to_string()).or_insert(pool).clone())
}