sqlite_tiny/api/
sqlite.rs1use super::ffiext;
4use crate::api::ffiext::PointerMut;
5use crate::api::query::Query;
6use crate::error::Error;
7use crate::{err, ffi};
8use std::ffi::CString;
9use std::ptr;
10
11#[derive(Debug)]
13pub struct Sqlite {
14 pub(in crate::api) raw: PointerMut<ffi::sqlite3>,
16}
17impl Sqlite {
18 pub fn new(path: &str) -> Result<Self, Error> {
20 Self::raw(path, ffi::SQLITE_OPEN_READWRITE | ffi::SQLITE_OPEN_CREATE)
21 }
22 pub fn uri(uri: &str) -> Result<Self, Error> {
24 Self::raw(uri, ffi::SQLITE_OPEN_READWRITE | ffi::SQLITE_OPEN_URI)
25 }
26 pub fn raw(location: &str, flags: std::ffi::c_int) -> Result<Self, Error> {
32 let path = CString::new(location).map_err(|e| err!(with: e, "Invalid database location"))?;
34 let mut database = ptr::null_mut();
35
36 let flags = flags | ffi::SQLITE_OPEN_FULLMUTEX;
38 let retval = unsafe { ffi::sqlite3_open_v2(path.as_ptr(), &mut database, flags, ptr::null()) };
39 unsafe { ffiext::sqlite3_check_result(retval, ptr::null_mut()) }?;
40
41 let database = PointerMut::new(database, ffi::sqlite3_close_v2);
43 Ok(Self { raw: database })
44 }
45
46 pub fn query(&self, query: &str) -> Result<Query, Error> {
48 let query = CString::new(query).map_err(|e| err!(with: e, "Invalid database query"))?;
50 let mut statement = ptr::null_mut();
51
52 let retval =
54 unsafe { ffi::sqlite3_prepare_v2(self.raw.as_ptr(), query.as_ptr(), -1, &mut statement, ptr::null_mut()) };
55 unsafe { ffiext::sqlite3_check_result(retval, self.raw.as_ptr()) }?;
56
57 let statement = PointerMut::new(statement, ffi::sqlite3_finalize);
59 Ok(Query { sqlite: self, raw: statement })
60 }
61
62 pub fn execute(&self, query: &str) -> Result<(), Error> {
64 let query = CString::new(query).map_err(|e| err!(with: e, "Invalid database query"))?;
66 let retval =
67 unsafe { ffi::sqlite3_exec(self.raw.as_ptr(), query.as_ptr(), None, ptr::null_mut(), ptr::null_mut()) };
68 unsafe { ffiext::sqlite3_check_result(retval, self.raw.as_ptr()) }?;
69
70 Ok(())
72 }
73}
74unsafe impl Send for Sqlite {
75 }
81unsafe impl Sync for Sqlite {
82 }