diff --git a/src/inner_connection.rs b/src/inner_connection.rs index 9e291c9..33245c8 100644 --- a/src/inner_connection.rs +++ b/src/inner_connection.rs @@ -59,7 +59,11 @@ impl InnerConnection { } } - pub fn open_with_flags(c_path: &CString, flags: OpenFlags) -> Result { + pub fn open_with_flags( + c_path: &CString, + flags: OpenFlags, + vfs: Option<&CString>, + ) -> Result { #[cfg(not(feature = "bundled"))] ensure_valid_sqlite_version(); ensure_safe_sqlite_threading_mode()?; @@ -79,10 +83,14 @@ impl InnerConnection { )); } + let z_vfs = match vfs { + Some(c_vfs) => c_vfs.as_ptr(), + None => ptr::null(), + }; + unsafe { let mut db = MaybeUninit::uninit(); - let r = - ffi::sqlite3_open_v2(c_path.as_ptr(), db.as_mut_ptr(), flags.bits(), ptr::null()); + let r = ffi::sqlite3_open_v2(c_path.as_ptr(), db.as_mut_ptr(), flags.bits(), z_vfs); let db: *mut ffi::sqlite3 = db.assume_init(); if r != ffi::SQLITE_OK { let e = if db.is_null() { diff --git a/src/lib.rs b/src/lib.rs index 775110e..30f457d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -371,7 +371,31 @@ impl Connection { /// string or if the underlying SQLite open call fails. pub fn open_with_flags>(path: P, flags: OpenFlags) -> Result { let c_path = path_to_cstring(path.as_ref())?; - InnerConnection::open_with_flags(&c_path, flags).map(|db| Connection { + InnerConnection::open_with_flags(&c_path, flags, None).map(|db| Connection { + db: RefCell::new(db), + cache: StatementCache::with_capacity(STATEMENT_CACHE_DEFAULT_CAPACITY), + path: Some(path.as_ref().to_path_buf()), + }) + } + + /// Open a new connection to a SQLite database using the specific flags and + /// vfs name. + /// + /// [Database Connection](http://www.sqlite.org/c3ref/open.html) for a description of valid + /// flag combinations. + /// + /// # Failure + /// + /// Will return `Err` if either `path` or `vfs` cannot be converted to a + /// C-compatible string or if the underlying SQLite open call fails. + pub fn open_with_flags_and_vfs>( + path: P, + flags: OpenFlags, + vfs: &str, + ) -> Result { + let c_path = path_to_cstring(path.as_ref())?; + let c_vfs = str_to_cstring(vfs)?; + InnerConnection::open_with_flags(&c_path, flags, Some(&c_vfs)).map(|db| Connection { db: RefCell::new(db), cache: StatementCache::with_capacity(STATEMENT_CACHE_DEFAULT_CAPACITY), path: Some(path.as_ref().to_path_buf()), @@ -387,12 +411,21 @@ impl Connection { /// /// Will return `Err` if the underlying SQLite open call fails. pub fn open_in_memory_with_flags(flags: OpenFlags) -> Result { - let c_memory = str_to_cstring(":memory:")?; - InnerConnection::open_with_flags(&c_memory, flags).map(|db| Connection { - db: RefCell::new(db), - cache: StatementCache::with_capacity(STATEMENT_CACHE_DEFAULT_CAPACITY), - path: None, - }) + Connection::open_with_flags(":memory:", flags) + } + + /// Open a new connection to an in-memory SQLite database using the specific + /// flags and vfs name. + /// + /// [Database Connection](http://www.sqlite.org/c3ref/open.html) for a description of valid + /// flag combinations. + /// + /// # Failure + /// + /// Will return `Err` if vfs` cannot be converted to a C-compatible + /// string or if the underlying SQLite open call fails. + pub fn open_in_memory_with_flags_and_vfs(flags: OpenFlags, vfs: &str) -> Result { + Connection::open_with_flags_and_vfs(":memory:", flags, vfs) } /// Convenience method to run multiple SQL statements (that cannot take any