11// cargo build --example memvfs --features dynamic
22
3- use std:: {
4- ffi:: { CStr , c_void} ,
5- os:: raw:: c_char,
6- sync:: Arc ,
7- } ;
3+ use std:: { ffi:: c_void, os:: raw:: c_char, sync:: Arc } ;
84
95use parking_lot:: Mutex ;
106use sqlite_plugin:: {
@@ -45,33 +41,6 @@ struct MemVfs {
4541impl Vfs for MemVfs {
4642 type Handle = File ;
4743
48- fn register_logger ( & self , logger : SqliteLogger ) {
49- struct LogCompat {
50- logger : Mutex < SqliteLogger > ,
51- }
52-
53- impl log:: Log for LogCompat {
54- fn enabled ( & self , _metadata : & log:: Metadata ) -> bool {
55- true
56- }
57-
58- fn log ( & self , record : & log:: Record ) {
59- let level = match record. level ( ) {
60- log:: Level :: Error => SqliteLogLevel :: Error ,
61- log:: Level :: Warn => SqliteLogLevel :: Warn ,
62- _ => SqliteLogLevel :: Notice ,
63- } ;
64- let msg = format ! ( "{}" , record. args( ) ) ;
65- self . logger . lock ( ) . log ( level, msg. as_bytes ( ) ) ;
66- }
67-
68- fn flush ( & self ) { }
69- }
70-
71- let log = LogCompat { logger : Mutex :: new ( logger) } ;
72- log:: set_boxed_logger ( Box :: new ( log) ) . expect ( "failed to setup global logger" ) ;
73- }
74-
7544 fn open ( & self , path : Option < & str > , opts : OpenOpts ) -> VfsResult < Self :: Handle > {
7645 log:: debug!( "open: path={:?}, opts={:?}" , path, opts) ;
7746 let mode = opts. mode ( ) ;
@@ -216,6 +185,33 @@ impl Vfs for MemVfs {
216185 }
217186}
218187
188+ fn setup_logger ( logger : SqliteLogger ) {
189+ struct LogCompat {
190+ logger : Mutex < SqliteLogger > ,
191+ }
192+
193+ impl log:: Log for LogCompat {
194+ fn enabled ( & self , _metadata : & log:: Metadata ) -> bool {
195+ true
196+ }
197+
198+ fn log ( & self , record : & log:: Record ) {
199+ let level = match record. level ( ) {
200+ log:: Level :: Error => SqliteLogLevel :: Error ,
201+ log:: Level :: Warn => SqliteLogLevel :: Warn ,
202+ _ => SqliteLogLevel :: Notice ,
203+ } ;
204+ let msg = format ! ( "{}" , record. args( ) ) ;
205+ self . logger . lock ( ) . log ( level, & msg) ;
206+ }
207+
208+ fn flush ( & self ) { }
209+ }
210+
211+ let log = LogCompat { logger : Mutex :: new ( logger) } ;
212+ log:: set_boxed_logger ( Box :: new ( log) ) . expect ( "failed to setup global logger" ) ;
213+ }
214+
219215/// This function is called by `SQLite` when the extension is loaded. It registers
220216/// the memvfs VFS with `SQLite`.
221217/// # Safety
@@ -226,18 +222,17 @@ pub unsafe extern "C" fn sqlite3_memvfs_init(
226222 _pz_err_msg : * mut * mut c_char ,
227223 p_api : * mut sqlite3_api_routines ,
228224) -> std:: os:: raw:: c_int {
229- let vfs = MemVfs { files : Default :: default ( ) } ;
230- const MEMVFS_NAME : & CStr = c"mem" ;
231- if let Err ( err) = unsafe {
225+ match unsafe {
232226 register_dynamic (
233227 p_api,
234- MEMVFS_NAME . to_owned ( ) ,
235- vfs ,
228+ c"mem" . to_owned ( ) ,
229+ MemVfs { files : Default :: default ( ) } ,
236230 RegisterOpts { make_default : true } ,
237231 )
238232 } {
239- return err;
240- }
233+ Ok ( logger) => setup_logger ( logger) ,
234+ Err ( err) => return err,
235+ } ;
241236
242237 // set the log level to trace
243238 log:: set_max_level ( log:: LevelFilter :: Trace ) ;
0 commit comments