summaryrefslogtreecommitdiffstats
path: root/melib/src/backends/maildir.rs
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-10-20 22:36:57 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-10-20 22:41:44 +0300
commit662706607b9d235f06567eb9cc2ccd26df85a725 (patch)
treed5cab83bbcec3740b96c4b02e58a4b70bfd3215f /melib/src/backends/maildir.rs
parentb904f91f45a9ae3a85b8328c28fbf61d3098124f (diff)
melib: remove memmap dependency
It's unmaintained, and the IO performance gains are negligible
Diffstat (limited to 'melib/src/backends/maildir.rs')
-rw-r--r--melib/src/backends/maildir.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/melib/src/backends/maildir.rs b/melib/src/backends/maildir.rs
index 70494ff5..86b4cd4f 100644
--- a/melib/src/backends/maildir.rs
+++ b/melib/src/backends/maildir.rs
@@ -31,11 +31,10 @@ use crate::email::Flag;
use crate::error::{MeliError, Result};
use crate::shellexpand::ShellExpandTrait;
pub use futures::stream::Stream;
-
-use memmap::{Mmap, Protection};
use std::collections::hash_map::DefaultHasher;
use std::fs;
use std::hash::{Hash, Hasher};
+use std::io::{BufReader, Read};
use std::path::{Path, PathBuf};
use std::sync::{Arc, Mutex};
@@ -45,7 +44,7 @@ pub struct MaildirOp {
hash_index: HashIndexes,
mailbox_hash: MailboxHash,
hash: EnvelopeHash,
- slice: Option<Mmap>,
+ slice: Option<Vec<u8>>,
}
impl Clone for MaildirOp {
@@ -92,10 +91,16 @@ impl MaildirOp {
impl<'a> BackendOp for MaildirOp {
fn as_bytes(&mut self) -> ResultFuture<Vec<u8>> {
if self.slice.is_none() {
- self.slice = Some(Mmap::open_path(self.path(), Protection::Read)?);
+ let file = std::fs::OpenOptions::new()
+ .read(true)
+ .write(false)
+ .open(&self.path())?;
+ let mut buf_reader = BufReader::new(file);
+ let mut contents = Vec::new();
+ buf_reader.read_to_end(&mut contents)?;
+ self.slice = Some(contents);
}
- /* Unwrap is safe since we use ? above. */
- let ret = Ok((unsafe { self.slice.as_ref().unwrap().as_slice() }).to_vec());
+ let ret = Ok(self.slice.as_ref().unwrap().as_slice().to_vec());
Ok(Box::pin(async move { ret }))
}