changeset 5967:0a6dd369afff HEAD

Don't cache flags unless we want them.
author Timo Sirainen <tss@iki.fi>
date Thu, 12 Jul 2007 06:41:06 +0300
parents 731be87a2128
children 885ed4d5c51d
files src/lib-storage/index/index-mail.c
diffstat 1 files changed, 28 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-mail.c	Thu Jul 12 06:40:51 2007 +0300
+++ b/src/lib-storage/index/index-mail.c	Thu Jul 12 06:41:06 2007 +0300
@@ -370,16 +370,39 @@
 	imap_bodystructure_parse_header(pool, part, hdr);
 }
 
+static bool want_plain_bodystructure_cached(struct index_mail *mail)
+{
+	if ((mail->wanted_fields & (MAIL_FETCH_IMAP_BODY |
+				    MAIL_FETCH_IMAP_BODYSTRUCTURE)) != 0)
+		return TRUE;
+
+	if (mail_cache_field_want_add(mail->trans->cache_trans, mail->data.seq,
+		mail->ibox->cache_fields[MAIL_CACHE_IMAP_BODY].idx))
+		return TRUE;
+	if (mail_cache_field_want_add(mail->trans->cache_trans, mail->data.seq,
+		mail->ibox->cache_fields[MAIL_CACHE_IMAP_BODYSTRUCTURE].idx))
+		return TRUE;
+	return FALSE;
+}
+
 static void index_mail_body_parsed_cache_flags(struct index_mail *mail)
 {
 	struct index_mail_data *data = &mail->data;
+	unsigned int cache_flags_idx;
 	uint32_t cache_flags = data->cache_flags;
+	bool want_cached;
+
+	cache_flags_idx = mail->ibox->cache_fields[MAIL_CACHE_FLAGS].idx;
+	want_cached = mail_cache_field_want_add(mail->trans->cache_trans,
+						data->seq, cache_flags_idx);
 
 	if (data->parsed_bodystructure &&
-	    imap_bodystructure_is_plain_7bit(data->parts)) {
+	    imap_bodystructure_is_plain_7bit(data->parts) &&
+	    (want_cached || want_plain_bodystructure_cached(mail))) {
 		cache_flags |= MAIL_CACHE_FLAG_TEXT_PLAIN_7BIT_ASCII;
 		/* we need message_parts cached to be able to
 		   actually use it in BODY/BODYSTRUCTURE reply */
+		want_cached = TRUE;
 		data->save_message_parts = TRUE;
 	}
 
@@ -404,11 +427,11 @@
 	if (data->body_size.virtual_size == data->body_size.physical_size)
 		cache_flags |= MAIL_CACHE_FLAG_BINARY_BODY;
 
-	if (cache_flags != data->cache_flags) {
-		data->cache_flags = cache_flags;
-		index_mail_cache_add(mail, MAIL_CACHE_FLAGS,
-				     &cache_flags, sizeof(cache_flags));
+	if (cache_flags != data->cache_flags && want_cached) {
+		index_mail_cache_add_idx(mail, cache_flags_idx,
+					 &cache_flags, sizeof(cache_flags));
 	}
+	data->cache_flags = cache_flags;
 }
 
 static void index_mail_body_parsed_cache_message_parts(struct index_mail *mail)