Mercurial > dovecot > core-2.2
changeset 22663:5524719c299a
lib-storage: When copying mails, copy also empty cache fields
This mainly means that it copies cache fields for nonexistent message
headers. Those are still important, because otherwise Dovecot doesn't know
whether they exist or not.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 06 Nov 2017 18:59:34 +0200 |
parents | 7fe2a998bc1f |
children | fea53c2725c0 |
files | src/lib-storage/index/index-storage.c |
diffstat | 1 files changed, 12 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.c Tue Nov 07 17:36:05 2017 +0200 +++ b/src/lib-storage/index/index-storage.c Mon Nov 06 18:59:34 2017 +0200 @@ -935,6 +935,7 @@ const struct mail_cache_field *dest_field; unsigned int src_field_idx, dest_field_idx; uint32_t t; + bool add = FALSE; src_field_idx = mail_cache_register_lookup(src_mail->box->cache, name); i_assert(src_field_idx != UINT_MAX); @@ -957,12 +958,14 @@ /* save date must update when mail is copied */ t = ioloop_time; buffer_append(buf, &t, sizeof(t)); + add = TRUE; + } else if (mail_cache_lookup_field(src_mail->transaction->cache_view, buf, + src_mail->seq, src_field_idx) <= 0) { + /* error / not found */ + buffer_set_used_size(buf, 0); } else { - if (mail_cache_lookup_field(src_mail->transaction->cache_view, buf, - src_mail->seq, src_field_idx) <= 0) - buffer_set_used_size(buf, 0); - else if (strcmp(name, "size.physical") == 0 || - strcmp(name, "size.virtual") == 0) { + if (strcmp(name, "size.physical") == 0 || + strcmp(name, "size.virtual") == 0) { /* FIXME: until mail_cache_lookup() can read unwritten cached data from buffer, we'll do this optimization to make quota plugin's work faster */ @@ -977,8 +980,11 @@ else imail->data.virtual_size = size; } + /* NOTE: we'll want to add also nonexistent headers, which + will keep the buf empty */ + add = TRUE; } - if (buf->used > 0) { + if (add) { mail_cache_add(dest_trans->cache_trans, dest_seq, dest_field_idx, buf->data, buf->used); }