use std::sync::Mutex;
pub(crate) struct Pool {
manager: r2d2_sqlite::SqliteConnectionManager,
reserve: Mutex<Vec<rusqlite::Connection>>,
max_reserve: usize,
}
impl Pool {
pub fn new(manager: r2d2_sqlite::SqliteConnectionManager) -> Self {
Self {
manager,
reserve: Mutex::new(Vec::new()),
max_reserve: 5,
}
}
pub fn pop(&self) -> rusqlite::Connection {
self.pop_fast().unwrap_or_else(|| {
use r2d2::ManageConnection;
self.manager.connect().unwrap()
})
}
#[cfg_attr(test, mutants::skip)]
fn pop_fast(&self) -> Option<rusqlite::Connection> {
self.reserve.lock().unwrap().pop()
}
#[cfg_attr(test, mutants::skip)]
pub fn push(&self, val: rusqlite::Connection) {
if let Some(a) = self.push_fast(val) {
drop(a)
}
}
#[cfg_attr(test, mutants::skip)]
fn push_fast(&self, val: rusqlite::Connection) -> Option<rusqlite::Connection> {
let mut guard = self.reserve.lock().unwrap();
if guard.len() < self.max_reserve {
guard.push(val);
None
} else {
Some(val)
}
}
}