@@ -5,12 +5,9 @@ pub mod ffi;
55pub mod mwal;
66pub mod wal_hook;
77
8- pub use wblibsql:: {
9- libsql_compile_wasm_module, libsql_free_wasm_module, libsql_run_wasm, libsql_wasm_engine_new,
10- } ;
11-
128use anyhow:: ensure;
139use rusqlite:: Connection ;
10+ use std:: os:: unix:: ffi:: OsStrExt ;
1411
1512use crate :: libsql:: { ffi:: libsql_wal_methods_register, wal_hook:: WalMethodsHook } ;
1613
@@ -19,6 +16,37 @@ use self::{
1916 wal_hook:: WalHook ,
2017} ;
2118
19+ pub struct WalConnection {
20+ inner : rusqlite:: Connection ,
21+ }
22+
23+ impl std:: ops:: Deref for WalConnection {
24+ type Target = rusqlite:: Connection ;
25+
26+ fn deref ( & self ) -> & Self :: Target {
27+ & self . inner
28+ }
29+ }
30+
31+ impl std:: ops:: Drop for WalConnection {
32+ fn drop ( & mut self ) {
33+ unsafe {
34+ rusqlite:: ffi:: sqlite3_close ( self . inner . handle ( ) ) ;
35+ }
36+ let _ = self . inner ;
37+ }
38+ }
39+
40+ extern "C" {
41+ fn libsql_open (
42+ filename : * const u8 ,
43+ ppdb : * mut * mut rusqlite:: ffi:: sqlite3 ,
44+ flags : std:: ffi:: c_int ,
45+ vfs : * const u8 ,
46+ wal : * const u8 ,
47+ ) -> i32 ;
48+ }
49+
2250fn get_orig_wal_methods ( ) -> anyhow:: Result < * mut libsql_wal_methods > {
2351 let orig: * mut libsql_wal_methods = unsafe { libsql_wal_methods_find ( 0 ) } ;
2452 if orig. is_null ( ) {
@@ -32,17 +60,29 @@ pub(crate) fn open_with_regular_wal(
3260 path : impl AsRef < std:: path:: Path > ,
3361 flags : rusqlite:: OpenFlags ,
3462 wal_hook : impl WalHook + ' static ,
35- ) -> anyhow:: Result < Connection > {
63+ ) -> anyhow:: Result < WalConnection > {
3664 unsafe {
65+ let mut pdb: * mut rusqlite:: ffi:: sqlite3 = std:: ptr:: null_mut ( ) ;
66+ let ppdb: * mut * mut rusqlite:: ffi:: sqlite3 = & mut pdb;
3767 let orig = get_orig_wal_methods ( ) ?;
3868 let wrapped = WalMethodsHook :: wrap ( orig, wal_hook) ;
3969 let res = libsql_wal_methods_register ( wrapped) ;
4070 ensure ! ( res == 0 , "failed to register WAL methods" ) ;
71+
72+ let open_err = libsql_open (
73+ path. as_ref ( ) . as_os_str ( ) . as_bytes ( ) . as_ptr ( ) ,
74+ ppdb,
75+ flags. bits ( ) ,
76+ std:: ptr:: null ( ) ,
77+ WalMethodsHook :: METHODS_NAME . as_ptr ( ) ,
78+ ) ;
79+ assert_eq ! ( open_err, 0 ) ;
80+ let conn = Connection :: from_handle ( pdb) ?;
81+ conn. pragma_update ( None , "journal_mode" , "wal" ) ?;
82+ tracing:: trace!(
83+ "Opening a connection with regular WAL at {}" ,
84+ path. as_ref( ) . display( )
85+ ) ;
86+ Ok ( WalConnection { inner : conn } )
4187 }
42- tracing:: trace!(
43- "Opening a connection with regular WAL at {}" ,
44- path. as_ref( ) . display( )
45- ) ;
46- let conn = Connection :: open_with_flags_and_wal ( path, flags, WalMethodsHook :: METHODS_NAME_STR ) ?;
47- Ok ( conn)
4888}
0 commit comments