@@ -76,9 +76,7 @@ impl Connection {
7676 // disabled so that we can sync our changes back to a remote
7777 // server.
7878 conn. query ( "PRAGMA journal_mode = WAL" , Params :: None ) ?;
79- unsafe {
80- ffi:: libsql_wal_disable_checkpoint ( conn. raw ) ;
81- }
79+ conn. wal_disable_checkpoint ( ) ?;
8280 }
8381 Ok ( conn)
8482 }
@@ -554,6 +552,16 @@ impl Connection {
554552 Ok ( buf)
555553 }
556554
555+ fn wal_disable_checkpoint ( & self ) -> Result < ( ) > {
556+ let rc = unsafe { libsql_sys:: ffi:: libsql_wal_disable_checkpoint ( self . handle ( ) ) } ;
557+ if rc != 0 {
558+ return Err ( crate :: errors:: Error :: SqliteFailure (
559+ rc as std:: ffi:: c_int ,
560+ format ! ( "wal_disable_checkpoint failed" ) ,
561+ ) ) ;
562+ }
563+ Ok ( ( ) )
564+ }
557565 fn wal_insert_begin ( & self ) -> Result < ( ) > {
558566 let rc = unsafe { libsql_sys:: ffi:: libsql_wal_insert_begin ( self . handle ( ) ) } ;
559567 if rc != 0 {
@@ -576,14 +584,14 @@ impl Connection {
576584 Ok ( ( ) )
577585 }
578586
579- fn wal_insert_frame ( & self , frame : & [ u8 ] ) -> Result < ( ) > {
587+ fn wal_insert_frame ( & self , frame_no : u32 , frame : & [ u8 ] ) -> Result < ( ) > {
580588 let mut conflict = 0i32 ;
581589 let rc = unsafe {
582590 libsql_sys:: ffi:: libsql_wal_insert_frame (
583591 self . handle ( ) ,
584- frame . len ( ) as u32 ,
592+ frame_no ,
585593 frame. as_ptr ( ) as * mut std:: ffi:: c_void ,
586- 0 ,
594+ frame . len ( ) as u32 ,
587595 & mut conflict,
588596 )
589597 } ;
@@ -658,13 +666,17 @@ unsafe extern "C" fn authorizer_callback(
658666
659667pub ( crate ) struct WalInsertHandle < ' a > {
660668 conn : & ' a Connection ,
661- in_session : RefCell < bool >
669+ in_session : RefCell < bool > ,
662670}
663671
664672impl WalInsertHandle < ' _ > {
665- pub fn insert ( & self , frame : & [ u8 ] ) -> Result < ( ) > {
673+ pub fn insert_at ( & self , frame_no : u32 , frame : & [ u8 ] ) -> Result < ( ) > {
666674 assert ! ( * self . in_session. borrow( ) ) ;
667- self . conn . wal_insert_frame ( frame)
675+ self . conn . wal_insert_frame ( frame_no, frame)
676+ }
677+
678+ pub fn in_session ( & self ) -> bool {
679+ * self . in_session . borrow ( )
668680 }
669681
670682 pub fn begin ( & self ) -> Result < ( ) > {
@@ -698,3 +710,54 @@ impl fmt::Debug for Connection {
698710 f. debug_struct ( "Connection" ) . finish ( )
699711 }
700712}
713+
714+ #[ cfg( test) ]
715+ mod tests {
716+ use crate :: {
717+ local:: { Connection , Database } ,
718+ params:: Params ,
719+ OpenFlags ,
720+ } ;
721+
722+ #[ tokio:: test]
723+ pub async fn test_kek ( ) {
724+ let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
725+ let path1 = temp_dir. path ( ) . join ( "local1.db" ) ;
726+ let db1 = Database :: new ( path1. to_str ( ) . unwrap ( ) . to_string ( ) , OpenFlags :: default ( ) ) ;
727+ let conn1 = Connection :: connect ( & db1) . unwrap ( ) ;
728+ conn1
729+ . query ( "PRAGMA journal_mode = WAL" , Params :: None )
730+ . unwrap ( ) ;
731+ conn1. wal_disable_checkpoint ( ) . unwrap ( ) ;
732+
733+ let path2 = temp_dir. path ( ) . join ( "local2.db" ) ;
734+ let db2 = Database :: new ( path2. to_str ( ) . unwrap ( ) . to_string ( ) , OpenFlags :: default ( ) ) ;
735+ let conn2 = Connection :: connect ( & db2) . unwrap ( ) ;
736+ conn2
737+ . query ( "PRAGMA journal_mode = WAL" , Params :: None )
738+ . unwrap ( ) ;
739+ conn2. wal_disable_checkpoint ( ) . unwrap ( ) ;
740+
741+ conn1. execute ( "CREATE TABLE t(x)" , Params :: None ) . unwrap ( ) ;
742+ const CNT : usize = 32 ;
743+ for _ in 0 ..CNT {
744+ conn1
745+ . execute (
746+ "INSERT INTO t VALUES (randomblob(1024 * 1024))" ,
747+ Params :: None ,
748+ )
749+ . unwrap ( ) ;
750+ }
751+ let handle = conn2. wal_insert_handle ( ) . unwrap ( ) ;
752+ let frame_count = conn1. wal_frame_count ( ) ;
753+ for frame_no in 0 ..frame_count {
754+ let frame = conn1. wal_get_frame ( frame_no + 1 , 4096 ) . unwrap ( ) ;
755+ handle. insert_at ( frame_no as u32 + 1 , & frame) . unwrap ( ) ;
756+ }
757+ let result = conn2. query ( "SELECT COUNT(*) FROM t" , Params :: None ) . unwrap ( ) ;
758+ let row = result. unwrap ( ) . next ( ) . unwrap ( ) . unwrap ( ) ;
759+ let column = row. get_value ( 0 ) . unwrap ( ) ;
760+ let cnt = * column. as_integer ( ) . unwrap ( ) ;
761+ assert_eq ! ( cnt, 32 as i64 ) ;
762+ }
763+ }
0 commit comments