Add cacheflush to Rust binding

This commit is contained in:
Diego Reis
2025-07-14 11:50:17 -03:00
parent 817ad8d50f
commit 5dd571483f
2 changed files with 71 additions and 0 deletions

View File

@@ -205,6 +205,17 @@ impl Connection {
})?;
Ok(())
}
/// Flush dirty pages to disk.
/// This will write the dirty pages to the WAL.
pub fn cacheflush(&self) -> Result<()> {
let conn = self
.inner
.lock()
.map_err(|e| Error::MutexError(e.to_string()))?;
conn.cacheflush()?;
Ok(())
}
}
impl Debug for Connection {

View File

@@ -1,3 +1,4 @@
use tokio::fs;
use turso::{Builder, Value};
#[tokio::test]
@@ -55,3 +56,62 @@ async fn test_rows_next() {
);
assert!(res.next().await.unwrap().is_none());
}
#[tokio::test]
async fn test_cacheflush() {
let builder = Builder::new_local("test.db");
let db = builder.build().await.unwrap();
let conn = db.connect().unwrap();
conn.execute("CREATE TABLE IF NOT EXISTS asdf (x INTEGER)", ())
.await
.unwrap();
// Tests if cache flush breaks transaction isolation
conn.execute("BEGIN", ()).await.unwrap();
conn.execute("INSERT INTO asdf (x) VALUES (1)", ())
.await
.unwrap();
conn.cacheflush().unwrap();
conn.execute("ROLLBACK", ()).await.unwrap();
conn.execute("INSERT INTO asdf (x) VALUES (2)", ())
.await
.unwrap();
conn.execute("INSERT INTO asdf (x) VALUES (3)", ())
.await
.unwrap();
let mut res = conn.query("SELECT * FROM asdf", ()).await.unwrap();
assert_eq!(
res.next().await.unwrap().unwrap().get_value(0).unwrap(),
2.into()
);
assert_eq!(
res.next().await.unwrap().unwrap().get_value(0).unwrap(),
3.into()
);
// Tests if cache flush doesn't break a committed transaction
conn.execute("BEGIN", ()).await.unwrap();
conn.execute("INSERT INTO asdf (x) VALUES (1)", ())
.await
.unwrap();
conn.cacheflush().unwrap();
conn.execute("COMMIT", ()).await.unwrap();
let mut res = conn
.query("SELECT * FROM asdf WHERE x = 1", ())
.await
.unwrap();
assert_eq!(
res.next().await.unwrap().unwrap().get_value(0).unwrap(),
1.into()
);
fs::remove_file("test.db").await.unwrap();
fs::remove_file("test.db-wal").await.unwrap();
}