diff options
Diffstat (limited to 'src/database.rs')
| -rw-r--r-- | src/database.rs | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/src/database.rs b/src/database.rs index 8a125b4..b73c5c2 100644 --- a/src/database.rs +++ b/src/database.rs @@ -3,6 +3,8 @@ use std::ops::Drop; use std::path::Path; use std::ptr; +use supercow::Supercow; + use libc; use error::Result; @@ -208,12 +210,46 @@ impl Database { } pub fn directory<'d, P: AsRef<Path>>(&'d self, path: &P) -> Result<Option<Directory<'d>>> { + <Self as DatabaseExt>::directory(self, path) + } + + pub fn create_query<'d>(&'d self, query_string: &str) -> Result<Query<'d>> { + <Self as DatabaseExt>::create_query(self, query_string) + } + + pub fn all_tags<'d>(&'d self) -> Result<Tags<'d, Self>> { + <Self as DatabaseExt>::all_tags(self) + } +} + +pub trait DatabaseExt{ + fn create_query<'d, D: Into<Supercow<'d, Database>>>(database: D, query_string: &str) -> Result<Query<'d>> { + let dbref = database.into(); + let query_str = CString::new(query_string).unwrap(); + + let query = unsafe { ffi::notmuch_query_create(dbref.handle.ptr, query_str.as_ptr()) }; + + Ok(Query::from_ptr(query, Supercow::phantom(dbref))) + } + + fn all_tags<'d, D: Into<Supercow<'d, Database>>>(database: D) -> Result<Tags<'d, Database>> { + let dbref = database.into(); + + let tags = unsafe { ffi::notmuch_database_get_all_tags(dbref.handle.ptr) }; + + Ok(Tags::from_ptr(tags, Supercow::phantom(dbref))) + } + + + fn directory<'d, D: Into<Supercow<'d, Database>>, P: AsRef<Path>>(database: D, path: &P) -> Result<Option<Directory<'d>>> { + let dbref = database.into(); + let path_str = CString::new(path.as_ref().to_str().unwrap()).unwrap(); let mut dir = ptr::null_mut(); try!( unsafe { - ffi::notmuch_database_get_directory(self.handle.ptr, path_str.as_ptr(), &mut dir) + ffi::notmuch_database_get_directory(dbref.handle.ptr, path_str.as_ptr(), &mut dir) } .as_result() ); @@ -221,26 +257,12 @@ impl Database { if dir.is_null() { Ok(None) } else { - Ok(Some(Directory::from_ptr(dir, self))) + Ok(Some(Directory::from_ptr(dir, Supercow::phantom(dbref)))) } } - - pub fn create_query<'d>(&'d self, query_string: &str) -> Result<Query<'d>> { - self.handle.create_query(query_string).map(move |handle|{ - Query::from_handle(handle, self) - }) - } - - pub fn all_tags<'d>(&'d self) -> Result<Tags<'d, Self>> { - let tags = unsafe { ffi::notmuch_database_get_all_tags(self.handle.ptr) }; - - Ok(Tags::from_ptr(tags, self)) - } } -pub trait DatabaseExt{ - -} +impl DatabaseExt for Database{} unsafe impl Send for Database {} |
