use rusqlite::{Connection, params};
#[cfg(feature = "tpool")]
use threadpool::ThreadPool;
use crate::Error;
#[cfg(feature = "tpool")]
use super::ConnPool;
pub fn freelist_count(conn: &Connection) -> Result<usize, rusqlite::Error> {
match conn.query_row_and_then("PRAGMA freelist_count;'", [], |row| {
row.get::<_, i64>(0)
}) {
Ok(npages) => {
Ok(usize::try_from(npages).unwrap())
}
Err(e) => Err(e)
}
}
#[allow(clippy::option_if_let_else)]
pub fn incremental_vacuum(
conn: &Connection,
n: Option<usize>
) -> Result<(), Error> {
let n = if let Some(n) = n {
Some(i64::try_from(n).map_err(|_| Error::bad_param("Invalid page count"))?)
} else {
None
};
if let Some(n) = n {
conn.execute("PRAGMA incremental_vacuum(?);", params![n])
} else {
conn.execute("PRAGMA incremental_vacuum;", params![])
}
.map(|_| ())
.map_err(Error::Sqlite)
}
#[cfg(feature = "tpool")]
#[must_use]
pub fn pooled_incremental_vacuum(
cpool: &ConnPool,
tpool: &ThreadPool,
n: Option<usize>
) -> swctx::WaitCtx<(), (), Error> {
let (sctx, wctx) = swctx::mkpair();
let conn = cpool.writer();
tpool.execute(move || match conn.incremental_vacuum(n) {
Ok(()) => {
let _ = sctx.set(());
}
Err(e) => {
let _ = sctx.fail(e);
}
});
wctx
}