use std::path::Path;
use crate::Result;
use crate::connection::Connection;
pub(crate) mod connection;
#[inline]
pub fn open<T: AsRef<Path>>(path: T) -> Result<Connection> {
connection::open(path, sqlite3_sys::SQLITE_OPEN_CREATE | sqlite3_sys::SQLITE_OPEN_READWRITE)
}
#[inline]
pub fn open_readonly<T: AsRef<Path>>(path: T) -> Result<Connection> {
connection::open(path, sqlite3_sys::SQLITE_OPEN_READONLY)
}
#[inline]
pub fn version() -> usize {
unsafe { sqlite3_sys::sqlite3_libversion_number() as usize }
}
#[cfg(test)]
mod tests {
use crate as concatsql;
use concatsql::prep;
use temporary::Directory;
#[test]
fn sqlite_open() {
let dir = Directory::new("sqlite").unwrap();
let path = dir.path().join("test.db");
crate::sqlite::open(":memory:").unwrap();
crate::sqlite::open(path).unwrap();
}
#[test]
fn sqlite_open_readonly() {
crate::sqlite::open_readonly(":memory:").unwrap();
let dir = Directory::new("sqlite").unwrap();
let path = dir.path().join("test.db");
{
let conn = crate::sqlite::open(&path).unwrap();
conn.execute(prep!("CREATE TABLE users(id INTEGER, name TEXT);")).unwrap();
}
crate::sqlite::open_readonly(path).unwrap();
}
#[test]
#[cfg(debug_assertions)]
fn should_readonly() {
use crate::error::*;
let dir = Directory::new("sqlite").unwrap();
let path = dir.path().join("test.db");
{
let conn = crate::sqlite::open(&path).unwrap();
conn.execute(prep!("CREATE TABLE users(id INTEGER, name TEXT);")).unwrap();
}
let conn = crate::sqlite::open_readonly(path).unwrap();
conn.error_level(ErrorLevel::Debug);
assert_eq!(
conn.execute(prep!("INSERT INTO users VALUES(42, 'Alice');")),
Err(Error::Message("exec error: attempt to write a readonly database".to_string()))
);
}
#[test]
#[should_panic = "failed to connect"]
fn sqlite_open_failed_path() {
use std::path::Path;
let _conn = crate::sqlite::open(Path::new("/path/to/db")).unwrap();
}
#[test]
#[should_panic = "failed to connect"]
fn sqlite_open_failed_str() {
let _conn = crate::sqlite::open("/path/to/db").unwrap();
}
#[test]
fn version() {
crate::sqlite::version();
}
}