@@ -76,9 +76,7 @@ impl Connection {
76
76
// disabled so that we can sync our changes back to a remote
77
77
// server.
78
78
conn. query ( "PRAGMA journal_mode = WAL" , Params :: None ) ?;
79
- unsafe {
80
- ffi:: libsql_wal_disable_checkpoint ( conn. raw ) ;
81
- }
79
+ conn. wal_disable_checkpoint ( ) ?;
82
80
}
83
81
Ok ( conn)
84
82
}
@@ -554,6 +552,16 @@ impl Connection {
554
552
Ok ( buf)
555
553
}
556
554
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
+ }
557
565
fn wal_insert_begin ( & self ) -> Result < ( ) > {
558
566
let rc = unsafe { libsql_sys:: ffi:: libsql_wal_insert_begin ( self . handle ( ) ) } ;
559
567
if rc != 0 {
@@ -576,14 +584,14 @@ impl Connection {
576
584
Ok ( ( ) )
577
585
}
578
586
579
- fn wal_insert_frame ( & self , frame : & [ u8 ] ) -> Result < ( ) > {
587
+ fn wal_insert_frame ( & self , frame_no : u32 , frame : & [ u8 ] ) -> Result < ( ) > {
580
588
let mut conflict = 0i32 ;
581
589
let rc = unsafe {
582
590
libsql_sys:: ffi:: libsql_wal_insert_frame (
583
591
self . handle ( ) ,
584
- frame . len ( ) as u32 ,
592
+ frame_no ,
585
593
frame. as_ptr ( ) as * mut std:: ffi:: c_void ,
586
- 0 ,
594
+ frame . len ( ) as u32 ,
587
595
& mut conflict,
588
596
)
589
597
} ;
@@ -658,13 +666,13 @@ unsafe extern "C" fn authorizer_callback(
658
666
659
667
pub ( crate ) struct WalInsertHandle < ' a > {
660
668
conn : & ' a Connection ,
661
- in_session : RefCell < bool >
669
+ in_session : RefCell < bool > ,
662
670
}
663
671
664
672
impl WalInsertHandle < ' _ > {
665
- pub fn insert ( & self , frame : & [ u8 ] ) -> Result < ( ) > {
673
+ pub fn insert_at ( & self , frame_no : u32 , frame : & [ u8 ] ) -> Result < ( ) > {
666
674
assert ! ( * self . in_session. borrow( ) ) ;
667
- self . conn . wal_insert_frame ( frame)
675
+ self . conn . wal_insert_frame ( frame_no , frame)
668
676
}
669
677
670
678
pub fn begin ( & self ) -> Result < ( ) > {
@@ -698,3 +706,54 @@ impl fmt::Debug for Connection {
698
706
f. debug_struct ( "Connection" ) . finish ( )
699
707
}
700
708
}
709
+
710
+ #[ cfg( test) ]
711
+ mod tests {
712
+ use crate :: {
713
+ local:: { Connection , Database } ,
714
+ params:: Params ,
715
+ OpenFlags ,
716
+ } ;
717
+
718
+ #[ tokio:: test]
719
+ pub async fn test_kek ( ) {
720
+ let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
721
+ let path1 = temp_dir. path ( ) . join ( "local1.db" ) ;
722
+ let db1 = Database :: new ( path1. to_str ( ) . unwrap ( ) . to_string ( ) , OpenFlags :: default ( ) ) ;
723
+ let conn1 = Connection :: connect ( & db1) . unwrap ( ) ;
724
+ conn1
725
+ . query ( "PRAGMA journal_mode = WAL" , Params :: None )
726
+ . unwrap ( ) ;
727
+ conn1. wal_disable_checkpoint ( ) . unwrap ( ) ;
728
+
729
+ let path2 = temp_dir. path ( ) . join ( "local2.db" ) ;
730
+ let db2 = Database :: new ( path2. to_str ( ) . unwrap ( ) . to_string ( ) , OpenFlags :: default ( ) ) ;
731
+ let conn2 = Connection :: connect ( & db2) . unwrap ( ) ;
732
+ conn2
733
+ . query ( "PRAGMA journal_mode = WAL" , Params :: None )
734
+ . unwrap ( ) ;
735
+ conn2. wal_disable_checkpoint ( ) . unwrap ( ) ;
736
+
737
+ conn1. execute ( "CREATE TABLE t(x)" , Params :: None ) . unwrap ( ) ;
738
+ const CNT : usize = 32 ;
739
+ for _ in 0 ..CNT {
740
+ conn1
741
+ . execute (
742
+ "INSERT INTO t VALUES (randomblob(1024 * 1024))" ,
743
+ Params :: None ,
744
+ )
745
+ . unwrap ( ) ;
746
+ }
747
+ let handle = conn2. wal_insert_handle ( ) . unwrap ( ) ;
748
+ let frame_count = conn1. wal_frame_count ( ) ;
749
+ for frame_no in 0 ..frame_count {
750
+ let frame = conn1. wal_get_frame ( frame_no + 1 , 4096 ) . unwrap ( ) ;
751
+ handle. insert_at ( frame_no as u32 + 1 , & frame) . unwrap ( ) ;
752
+ }
753
+ let result = conn2. query ( "SELECT COUNT(*) FROM t" , Params :: None ) . unwrap ( ) ;
754
+ let row = result. unwrap ( ) . next ( ) . unwrap ( ) . unwrap ( ) ;
755
+ let column = row. get_value ( 0 ) . unwrap ( ) ;
756
+ let cnt = * column. as_integer ( ) . unwrap ( ) ;
757
+ assert_eq ! ( cnt, 32 as i64 ) ;
758
+ }
759
+ }
0 commit comments