mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-26 11:31:37 +08:00
Merge pull request #630 from gwenn/pr/open-with-vfs
add ability to open sqlite connection with specified vfs
This commit is contained in:
commit
406cd6d2cf
@ -59,7 +59,11 @@ impl InnerConnection {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn open_with_flags(c_path: &CString, flags: OpenFlags) -> Result<InnerConnection> {
|
||||
pub fn open_with_flags(
|
||||
c_path: &CString,
|
||||
flags: OpenFlags,
|
||||
vfs: Option<&CString>,
|
||||
) -> Result<InnerConnection> {
|
||||
#[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() {
|
||||
|
47
src/lib.rs
47
src/lib.rs
@ -371,7 +371,31 @@ impl Connection {
|
||||
/// string or if the underlying SQLite open call fails.
|
||||
pub fn open_with_flags<P: AsRef<Path>>(path: P, flags: OpenFlags) -> Result<Connection> {
|
||||
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<P: AsRef<Path>>(
|
||||
path: P,
|
||||
flags: OpenFlags,
|
||||
vfs: &str,
|
||||
) -> Result<Connection> {
|
||||
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<Connection> {
|
||||
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> {
|
||||
Connection::open_with_flags_and_vfs(":memory:", flags, vfs)
|
||||
}
|
||||
|
||||
/// Convenience method to run multiple SQL statements (that cannot take any
|
||||
|
Loading…
Reference in New Issue
Block a user