use std::ffi::c_int;
use std::ptr;
use crate::error::decode_result_raw;
use crate::ffi;
use crate::inner_connection::InnerConnection;
use crate::{Connection, Name, Result};
#[derive(Clone, Copy, Default)]
#[repr(i32)]
#[non_exhaustive]
pub enum CheckpointMode {
#[default]
PASSIVE = ffi::SQLITE_CHECKPOINT_PASSIVE,
FULL = ffi::SQLITE_CHECKPOINT_FULL,
RESTART = ffi::SQLITE_CHECKPOINT_RESTART,
TRUNCATE = ffi::SQLITE_CHECKPOINT_TRUNCATE,
#[cfg(feature = "modern_sqlite")] NOOP = -1, }
impl Connection {
pub fn wal_checkpoint_v2<N: Name>(
&self,
db_name: Option<N>,
mode: CheckpointMode,
) -> Result<(c_int, c_int)> {
self.db.borrow_mut().wal_checkpoint_v2(db_name, mode)
}
}
impl InnerConnection {
pub(crate) fn wal_checkpoint_v2<N: Name>(
&mut self,
db_name: Option<N>,
mode: CheckpointMode,
) -> Result<(c_int, c_int)> {
let cs = db_name.as_ref().map(N::as_cstr).transpose()?;
let db_name = cs.as_ref().map_or(ptr::null(), |s| s.as_ptr());
let mut n_log = 0;
let mut n_ckpt = 0;
unsafe {
decode_result_raw(
self.db,
ffi::sqlite3_wal_checkpoint_v2(
self.db,
db_name,
mode as c_int,
&raw mut n_log,
&raw mut n_ckpt,
),
)?;
};
Ok((n_log, n_ckpt))
}
}
#[cfg(all(test, not(miri)))]
mod test {
use super::CheckpointMode;
use crate::{Connection, DEFAULT_NAME, Result};
#[cfg(all(target_family = "wasm", target_os = "unknown"))]
use wasm_bindgen_test::wasm_bindgen_test as test;
#[cfg_attr(
all(target_family = "wasm", target_os = "unknown"),
ignore = "no filesystem on this platform"
)]
#[test]
fn wal_checkpoint_v2() -> Result<()> {
let temp_dir = tempfile::tempdir().unwrap();
let path = temp_dir.path().join("wal.db3");
let db = Connection::open(&path)?;
let (n_log, n_ckpt) = db.wal_checkpoint_v2(DEFAULT_NAME, CheckpointMode::default())?;
assert_eq!(n_log, -1);
assert_eq!(n_ckpt, -1);
db.pragma_update(None, "journal_mode", "wal")?;
let (n_log, n_ckpt) = db.wal_checkpoint_v2(DEFAULT_NAME, CheckpointMode::default())?;
assert_eq!(n_log, 0);
assert_eq!(n_ckpt, 0);
Ok(())
}
}