use std::ffi::{CStr, CString};
use std::ops::Drop;
use std::path::Path;
use std::ptr;
use supercow::Supercow;
use libc;
use error::{Error, Result};
use ffi;
use ffi::Status;
use utils::ToStr;
use Directory;
use Query;
use Tags;
use TagsOwner;
use utils::ScopedSupercow;
// Re-exported under database module for pretty namespacin'.
pub use ffi::DatabaseMode;
#[derive(Copy, Clone, Debug)]
pub struct Version(libc::c_uint);
#[derive(Clone, Debug)]
pub struct Revision {
pub revision: libc::c_ulong,
pub uuid: String,
}
#[derive(Debug)]
pub struct Database {
pub(crate) ptr: *mut ffi::notmuch_database_t,
}
impl Drop for Database {
fn drop(&mut self) {
unsafe { ffi::notmuch_database_destroy(self.ptr) };
}
}
impl TagsOwner for Database {}
impl Database {
pub fn create
(path: &P) -> Result
where
P: AsRef,
{
let path_str = CString::new(path.as_ref().to_str().unwrap()).unwrap();
let mut db = ptr::null_mut();
unsafe { ffi::notmuch_database_create(path_str.as_ptr(), &mut db) }.as_result()?;
Ok(Database {
ptr: db,
})
}
pub fn open
(path: &P, mode: DatabaseMode) -> Result
where
P: AsRef,
{
let path_str = CString::new(path.as_ref().to_str().unwrap()).unwrap();
let mut db = ptr::null_mut();
unsafe { ffi::notmuch_database_open(path_str.as_ptr(), mode.into(), &mut db) }
.as_result()?;
Ok(Database {
ptr: db,
})
}
pub fn close(&mut self) -> Result<()> {
unsafe { ffi::notmuch_database_close(self.ptr) }.as_result()?;
Ok(())
}
pub fn compact