diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-01-05 15:36:40 +0100 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-01-05 15:36:40 +0100 |
commit | 335750a29a83edba9bce2fb7e1452001e4962d1f (patch) | |
tree | bea1e1f767cbd662e7a7f9b674a7ebeae195cd0a | |
parent | d3c156a087f3c767fc0d2376abd7c1d304161d47 (diff) | |
download | aerogramme-335750a29a83edba9bce2fb7e1452001e4962d1f.tar.gz aerogramme-335750a29a83edba9bce2fb7e1452001e4962d1f.zip |
MOVE command is optimized
-rw-r--r-- | src/imap/mailbox_view.rs | 9 | ||||
-rw-r--r-- | src/mail/mailbox.rs | 3 | ||||
-rw-r--r-- | src/mail/mod.rs | 2 | ||||
-rw-r--r-- | src/mail/query.rs | 0 | ||||
-rw-r--r-- | src/mail/snapshot.rs | 11 |
5 files changed, 16 insertions, 9 deletions
diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs index 4d0858f..6db1bd2 100644 --- a/src/imap/mailbox_view.rs +++ b/src/imap/mailbox_view.rs @@ -228,19 +228,16 @@ impl MailboxView { ) -> Result<(ImapUidvalidity, Vec<(ImapUid, ImapUid)>, Vec<Body<'static>>)> { let mails = self.get_mail_ids(sequence_set, *is_uid_copy)?; - let mut new_uuids = vec![]; for mi in mails.iter() { - let copy_action = to.copy_from(&self.mailbox, mi.uuid).await?; - new_uuids.push(copy_action); - self.mailbox.delete(mi.uuid).await? + to.move_from(&self.mailbox, mi.uuid).await?; } let mut ret = vec![]; let to_state = to.current_uid_index().await; - for (mi, new_uuid) in mails.iter().zip(new_uuids.iter()) { + for mi in mails.iter() { let dest_uid = to_state .table - .get(new_uuid) + .get(&mi.uuid) .ok_or(anyhow!("moved mail not in destination mailbox"))? .0; ret.push((mi.uid, dest_uid)); diff --git a/src/mail/mailbox.rs b/src/mail/mailbox.rs index e424ba3..b011110 100644 --- a/src/mail/mailbox.rs +++ b/src/mail/mailbox.rs @@ -149,7 +149,6 @@ impl Mailbox { /// Move an email from an other Mailbox to this mailbox /// (use this when possible, as it allows for a certain number of storage optimizations) - #[allow(dead_code)] pub async fn move_from(&self, from: &Mailbox, uuid: UniqueIdent) -> Result<()> { if self.id == from.id { bail!("Cannot copy move same mailbox"); @@ -403,8 +402,6 @@ impl MailboxInternal { Ok(new_id) } - #[allow(dead_code)] - // 2023-05-15 will probably be used later async fn move_from(&mut self, from: &mut MailboxInternal, id: UniqueIdent) -> Result<()> { self.copy_internal(from, id, id).await?; from.delete(id).await?; diff --git a/src/mail/mod.rs b/src/mail/mod.rs index bbe4033..7371b53 100644 --- a/src/mail/mod.rs +++ b/src/mail/mod.rs @@ -3,6 +3,8 @@ use std::io::Write; pub mod incoming; pub mod mailbox; +pub mod snapshot; +pub mod query; pub mod uidindex; pub mod unique_ident; pub mod user; diff --git a/src/mail/query.rs b/src/mail/query.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/mail/query.rs diff --git a/src/mail/snapshot.rs b/src/mail/snapshot.rs new file mode 100644 index 0000000..7256d50 --- /dev/null +++ b/src/mail/snapshot.rs @@ -0,0 +1,11 @@ +use std::sync::Arc; +use super::mailbox::Mailbox; +use super::uidindex::UidIndex; + +pub struct Snapshot { + pub mailbox: Arc<Mailbox>, + pub snapshot: UidIndex, +} + +impl Snapshot { +} |