Mercurial > dovecot > core-2.2
changeset 15428:9107b794b7ad
lib-storage: When updating flags in private index and nothing changes, don't increase modseq.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 28 Nov 2012 07:24:01 +0200 |
parents | 3c5f674285a8 |
children | e123e31de340 |
files | src/lib-storage/index/index-mail.c |
diffstat | 1 files changed, 29 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-mail.c Wed Nov 28 06:51:16 2012 +0200 +++ b/src/lib-storage/index/index-mail.c Wed Nov 28 07:24:01 2012 +0200 @@ -1655,6 +1655,34 @@ } } +static bool +index_mail_update_pvt_flags(struct mail *_mail, enum modify_type modify_type, + enum mail_flags pvt_flags) +{ + struct mail_private *mail = (struct mail_private *)_mail; + const struct mail_index_record *rec; + enum mail_flags old_pvt_flags; + + if (!index_mail_get_pvt(_mail)) + return FALSE; + if (pvt_flags == 0 && modify_type != MODIFY_REPLACE) + return FALSE; + + /* see if the flags actually change anything */ + rec = mail_index_lookup(_mail->transaction->view_pvt, mail->seq_pvt); + old_pvt_flags = rec->flags & mailbox_get_private_flags_mask(_mail->box); + + switch (modify_type) { + case MODIFY_ADD: + return (old_pvt_flags & pvt_flags) != pvt_flags; + case MODIFY_REPLACE: + return old_pvt_flags != pvt_flags; + case MODIFY_REMOVE: + return (old_pvt_flags & pvt_flags) != 0; + } + i_unreached(); +} + void index_mail_update_flags(struct mail *_mail, enum modify_type modify_type, enum mail_flags flags) { @@ -1672,8 +1700,7 @@ pvt_flags_mask = mailbox_get_private_flags_mask(_mail->box); pvt_flags = flags & pvt_flags_mask; flags &= ~pvt_flags_mask; - if (index_mail_get_pvt(_mail) && - (pvt_flags != 0 || modify_type == MODIFY_REPLACE)) { + if (index_mail_update_pvt_flags(_mail, modify_type, pvt_flags)) { mail_index_update_flags(_mail->transaction->itrans_pvt, mail->seq_pvt, modify_type, pvt_flags);