diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/database.rs | 2 | ||||
| -rw-r--r-- | src/index.rs | 2 | ||||
| -rw-r--r-- | src/lib.rs | 2 | ||||
| -rw-r--r-- | src/message.rs | 36 |
4 files changed, 39 insertions, 3 deletions
diff --git a/src/database.rs b/src/database.rs index f3733ef..c828bb2 100644 --- a/src/database.rs +++ b/src/database.rs @@ -395,7 +395,7 @@ pub trait DatabaseExt { unsafe { ffi::notmuch_database_index_file(dbref.ptr, msg_path.as_ptr(), opts, &mut msg) } .as_result()?; - Ok(Message::from_ptr(msg, Supercow::phantom(dbref))) + Ok(Message::from_ptr(msg, ScopedSupercow::phantom(dbref))) } None => Err(Error::NotmuchError(Status::FileError)), } diff --git a/src/index.rs b/src/index.rs index 41505b6..a672dfb 100644 --- a/src/index.rs +++ b/src/index.rs @@ -1,5 +1,5 @@ use std::ops::Drop; -use supercow::Supercow; +use supercow::{Supercow, Phantomcow}; use error::{Error, Result}; use ffi; @@ -26,7 +26,7 @@ pub use database::{Database, DatabaseExt}; pub use directory::{Directory, DirectoryExt}; pub use error::Error; pub use filenames::{Filenames, FilenamesOwner}; -pub use message::{Message, MessageExt, MessageOwner}; +pub use message::{Message, MessageExt, MessageOwner, FrozenMessage}; pub use messages::{Messages, MessagesExt}; pub use query::{Query, QueryExt}; pub use tags::{Tags, TagsExt, TagsOwner}; diff --git a/src/message.rs b/src/message.rs index f5d0542..77aecc3 100644 --- a/src/message.rs +++ b/src/message.rs @@ -175,3 +175,39 @@ impl<'o, O> MessageExt<'o, O> for Message<'o, O> where O: MessageOwner + 'o {} unsafe impl<'o, O> Send for Message<'o, O> where O: MessageOwner + 'o {} unsafe impl<'o, O> Sync for Message<'o, O> where O: MessageOwner + 'o {} + + +pub struct FrozenMessage<'m ,'o, O> +where + O: MessageOwner + 'o +{ + message: ScopedSupercow<'m, Message<'o, O>> +} + + +impl<'m, 'o, O> FrozenMessage<'m, 'o, O> +where + O: MessageOwner + 'o +{ + pub fn new<M>(message: M) -> Result<Self> + where + M: Into<ScopedSupercow<'m, Message<'o, O>>> + { + let msg = message.into(); + msg.freeze()?; + Ok(FrozenMessage{ + message: msg + }) + } +} + +impl<'m, 'o, O> Drop for FrozenMessage<'m, 'o, O> +where + O: MessageOwner + 'o +{ + fn drop(&mut self) { + let _ = self.message.thaw(); + } +} + + |
