sqlite3/access/
mod.rs

1//! Access to open sqlite3 database by filename.
2//!
3//! The `core` module requires explicit authority to access files and such,
4//! following the principle of least authority.
5//!
6//! This module provides the privileged functions to create such authorities.
7//!
8//! *TODO: move `mod access` to its own crate so that linking to `sqlite3` doesn't
9//! bring in this ambient authority.*
10
11use libc::c_int;
12use std::ptr;
13
14use super::SqliteResult;
15use core::{Access, DatabaseConnection, str_charstar};
16use ffi;
17
18use access::flags::OpenFlags;
19
20// submodule KLUDGE around missing_docs for bitflags!()
21#[allow(missing_docs)]
22pub mod flags;
23
24/// Open a database by filename.
25///
26/// *TODO: test for "Note that sqlite3_open() can be used to either
27/// open existing database files or to create and open new database
28/// files."*
29///
30///
31/// Refer to [Opening A New Database][open] regarding URI filenames.
32///
33/// [open]: http://www.sqlite.org/c3ref/open.html
34pub fn open(filename: &str, flags: Option<OpenFlags>) -> SqliteResult<DatabaseConnection> {
35    DatabaseConnection::new(
36        ByFilename {
37            filename: filename,
38            flags: flags.unwrap_or_default()
39        })
40}
41
42/// Access to a database by filename
43pub struct ByFilename<'a> {
44    /// Filename or sqlite3 style URI.
45    pub filename: &'a str,
46    /// Flags for additional control over the new database connection.
47    pub flags: OpenFlags
48}
49
50impl<'a> Access for ByFilename<'a> {
51    fn open(self, db: *mut *mut ffi::sqlite3) -> c_int {
52        let c_filename = str_charstar(self.filename);
53        let flags = self.flags.bits();
54        unsafe { ffi::sqlite3_open_v2(c_filename.as_ptr(), db, flags, ptr::null()) }
55    }
56}
57
58
59
60#[cfg(test)]
61mod tests {
62    use std::default::Default;
63    use super::ByFilename;
64    use core::DatabaseConnection;
65    use std::env::temp_dir;
66
67    #[test]
68    fn open_file_db() {
69        let mut temp_directory = temp_dir();
70        temp_directory.push("db1");
71        let path = temp_directory.into_os_string().into_string().unwrap();
72        DatabaseConnection::new(
73            ByFilename {
74                filename: path.as_ref(), flags: Default::default()
75            })
76            .unwrap();
77    }
78}
79
80// Local Variables:
81// flycheck-rust-crate-root: "lib.rs"
82// End: