diff --git a/libsql/src/errors.rs b/libsql/src/errors.rs index cc82028826..8d3ed0e581 100644 --- a/libsql/src/errors.rs +++ b/libsql/src/errors.rs @@ -57,6 +57,8 @@ pub enum Error { InvalidBlobSize(usize), #[error("sync error: {0}")] Sync(crate::BoxError), + #[error("WAL frame insert conflict")] + WalConflict, } #[cfg(feature = "hrana")] diff --git a/libsql/src/local/connection.rs b/libsql/src/local/connection.rs index 761cb2d22a..5c82e19460 100644 --- a/libsql/src/local/connection.rs +++ b/libsql/src/local/connection.rs @@ -532,21 +532,29 @@ impl Connection { Ok(()) } - fn wal_insert_frame(&self, frame: &[u8]) -> Result<()> { + pub fn wal_insert_frame(&self, frame: &[u8]) -> Result<()> { + let mut conflict = 0i32; let rc = unsafe { libsql_sys::ffi::libsql_wal_insert_frame( self.handle(), frame.len() as u32, frame.as_ptr() as *mut std::ffi::c_void, 0, + &mut conflict, ) }; + if rc != 0 { - return Err(crate::errors::Error::SqliteFailure( + return Err(errors::Error::SqliteFailure( rc as std::ffi::c_int, - format!("wal_insert_frame failed"), + "wal_insert_frame failed".to_string(), )); } + + if conflict != 0 { + return Err(errors::Error::WalConflict); + } + Ok(()) }