diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 7727d435..0b1e6c7b 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -525,17 +525,25 @@ impl ImapType { .collect::>() } - pub fn search(&self, query: String) -> Result> { + pub fn search( + &self, + query: String, + folder_hash: FolderHash, + ) -> Result> { + let folders_lck = self.folders.lock()?; let mut response = String::with_capacity(8 * 1024); let mut conn = self.connection.lock()?; + conn.send_command(format!("EXAMINE {}", folders_lck[&folder_hash].path()).as_bytes())?; + conn.read_response(&mut response)?; conn.send_command(format!("UID SEARCH CHARSET UTF-8 {}", query).as_bytes())?; conn.read_response(&mut response)?; + debug!(&response); let mut lines = response.lines(); for l in lines.by_ref() { if l.starts_with("* SEARCH") { use std::iter::FromIterator; - let uid_index = self.uid_index.lock().unwrap(); + let uid_index = self.uid_index.lock()?; return Ok(crate::structs::StackVec::from_iter( l["* SEARCH".len()..] .trim() diff --git a/ui/src/cache.rs b/ui/src/cache.rs index 9551e333..8ffac4c3 100644 --- a/ui/src/cache.rs +++ b/ui/src/cache.rs @@ -407,6 +407,7 @@ pub fn query_to_imap(q: &Query) -> String { pub fn imap_search( term: &str, (sort_field, sort_order): (SortField, SortOrder), + folder_hash: FolderHash, backend: &Arc>>, ) -> Result> { let query = query().parse(term)?.1; @@ -414,7 +415,7 @@ pub fn imap_search( let b = (*backend_lck).as_any(); if let Some(imap_backend) = b.downcast_ref::() { - imap_backend.search(query_to_imap(&query)) + imap_backend.search(query_to_imap(&query), folder_hash) } else { panic!("Could not downcast ImapType backend. BUG"); } diff --git a/ui/src/conf/accounts.rs b/ui/src/conf/accounts.rs index 78aa01a0..c26a7032 100644 --- a/ui/src/conf/accounts.rs +++ b/ui/src/conf/accounts.rs @@ -812,7 +812,6 @@ impl Account { ret } - #[allow(unused_variables)] pub fn search( &self, search_term: &str, @@ -820,7 +819,7 @@ impl Account { folder_hash: FolderHash, ) -> Result> { if self.settings.account().format() == "imap" { - return crate::cache::imap_search(search_term, sort, &self.backend); + return crate::cache::imap_search(search_term, sort, folder_hash, &self.backend); } #[cfg(feature = "sqlite3")]