aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/database.rs2
-rw-r--r--src/index.rs2
-rw-r--r--src/lib.rs2
-rw-r--r--src/message.rs36
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;
diff --git a/src/lib.rs b/src/lib.rs
index 0336e8a..f32ce95 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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();
+ }
+}
+
+