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);
 	}