#![cfg(feature = "std")]
use graphitesql::pager::{AutoVacuum, WritePager};
use graphitesql::vfs::{std_file::StdVfs, OpenFlags, Vfs};
use std::process::Command;
fn have_sqlite3() -> bool {
Command::new("sqlite3")
.arg("--version")
.output()
.map(|o| o.status.success())
.unwrap_or(false)
}
fn sqlite3(path: &str, sql: &str) -> String {
let out = Command::new("sqlite3")
.arg(path)
.arg(sql)
.output()
.expect("spawn sqlite3");
assert!(
out.status.success(),
"sqlite3 {sql:?} failed: {}",
String::from_utf8_lossy(&out.stderr)
);
String::from_utf8_lossy(&out.stdout).trim().to_string()
}
fn create_empty(path: &str, mode: AutoVacuum) {
let _ = std::fs::remove_file(path);
let vfs = StdVfs::new();
let file = vfs.open(path, OpenFlags::READ_WRITE_CREATE).unwrap();
let journal = vfs
.open(&format!("{path}-journal"), OpenFlags::READ_WRITE_CREATE)
.unwrap();
let mut wp = WritePager::create_auto_vacuum(file, Some(journal), None, 4096, mode).unwrap();
wp.commit().unwrap();
drop(wp);
let file = vfs.open(path, OpenFlags::READ_WRITE).unwrap();
let wp = WritePager::open(file, None).unwrap();
assert_eq!(wp.auto_vacuum(), mode, "graphite re-read mode mismatch");
}
fn run_mode(mode: AutoVacuum, expected_pragma: &str) {
let mut p = std::env::temp_dir();
p.push(format!(
"graphitesql-av-{:?}-{}.db",
mode,
std::process::id()
));
let path = p.to_string_lossy().into_owned();
create_empty(&path, mode);
if have_sqlite3() {
assert_eq!(
sqlite3(&path, "PRAGMA auto_vacuum;"),
expected_pragma,
"auto_vacuum pragma for {mode:?}"
);
assert_eq!(
sqlite3(&path, "PRAGMA integrity_check;"),
"ok",
"integrity_check for {mode:?}"
);
assert_eq!(
sqlite3(
&path,
"CREATE TABLE t(a); INSERT INTO t VALUES(1); SELECT count(*) FROM t;"
),
"1",
"round-trip usage for {mode:?}"
);
}
let _ = std::fs::remove_file(&path);
let _ = std::fs::remove_file(format!("{path}-journal"));
}
#[test]
fn auto_vacuum_full_db_opens_in_sqlite() {
run_mode(AutoVacuum::Full, "1");
}
#[test]
fn auto_vacuum_incremental_db_opens_in_sqlite() {
run_mode(AutoVacuum::Incremental, "2");
}
#[test]
fn auto_vacuum_none_db_opens_in_sqlite() {
run_mode(AutoVacuum::None, "0");
}