use std::sync::RwLock;
use anyhow::Result;
use duckdb::Connection;
pub trait ConnProvider: Send + Sync {
fn acquire(&self) -> Result<Connection>;
fn release(&self, con: Connection);
}
static PROVIDER: RwLock<Option<Box<dyn ConnProvider>>> = RwLock::new(None);
pub fn set_provider(p: Box<dyn ConnProvider>) {
*PROVIDER.write().unwrap_or_else(|e| e.into_inner()) = Some(p);
}
pub fn acquire(base: &Connection) -> Result<Connection> {
if let Some(p) = PROVIDER.read().unwrap_or_else(|e| e.into_inner()).as_ref() { return p.acquire(); }
Ok(base.try_clone()?)
}
pub fn release(con: Connection) {
if let Some(p) = PROVIDER.read().unwrap_or_else(|e| e.into_inner()).as_ref() { p.release(con); }
}