changeset 3493:3cc5229f1560 HEAD

Header caching was more or less broken.
author Timo Sirainen <tss@iki.fi>
date Wed, 13 Jul 2005 11:25:24 +0300
parents ab0fc2c1d8e1
children 7cab5dc6a0cd
files src/lib-storage/index/index-mail-headers.c src/lib-storage/index/index-mail.h
diffstat 2 files changed, 25 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-mail-headers.c	Wed Jul 13 00:15:16 2005 +0300
+++ b/src/lib-storage/index/index-mail-headers.c	Wed Jul 13 11:25:24 2005 +0300
@@ -37,13 +37,11 @@
 static void index_mail_parse_header_finish(struct index_mail *mail)
 {
 	struct index_mail_line *lines;
-	const struct mail_cache_field *all_cache_fields;
 	const unsigned char *header, *data;
 	const uint8_t *match;
 	buffer_t *buf;
 	size_t data_size;
 	unsigned int i, j, count, match_idx, match_count;
-	unsigned int all_cache_fields_count;
 	int noncontiguous;
 
 	t_push();
@@ -139,23 +137,24 @@
 	}
 
 	/* set all non-found headers registered in cache */
-	all_cache_fields =
-		mail_cache_register_get_list(mail->ibox->cache,
-					     pool_datastack_create(),
-					     &all_cache_fields_count);
-	for (i = 0; i < all_cache_fields_count; i++) {
-		unsigned int cache_field = all_cache_fields[i].idx;
+	for (i = 0; i < mail->data.all_cache_fields_count; i++) {
+		unsigned int cache_field = mail->data.all_cache_fields[i].idx;
 
-		/* first check that it isn't already added */
-		if (all_cache_fields[i].idx < match_count &&
-		    match[cache_field] == mail->header_match_value)
+		/* first check that it isn't already added in this session */
+		if (cache_field < match_count &&
+		    (match[cache_field] & ~1) == mail->header_match_value)
 			continue;
 
-		if (strncasecmp(all_cache_fields[i].name, "hdr.", 4) != 0)
+		if (strncasecmp(mail->data.all_cache_fields[i].name,
+				"hdr.", 4) != 0)
 			continue;
 
-		mail_cache_add(mail->trans->cache_trans,
-			       mail->data.seq, cache_field, NULL, 0);
+		/* check that it hadn't been added in some older session */
+		if (mail_cache_field_exists(mail->trans->cache_view,
+					    mail->data.seq, cache_field) == 0) {
+			mail_cache_add(mail->trans->cache_trans,
+				       mail->data.seq, cache_field, NULL, 0);
+		}
 	}
 	t_pop();
 }
@@ -225,6 +224,15 @@
 			      get_header_field_idx(mail->ibox, "Date"),
 			      &mail->header_match_value);
 	}
+
+	/* get a list of all currently cached fields. we'll later set those
+	   headers that weren't found to empty. if this list is get later,
+	   it's possible that it has already changed (cache has no permanent
+	   write locks, remember!) and we set some headers to empty even
+	   though they really exist. */
+	mail->data.all_cache_fields =
+		mail_cache_register_get_list(mail->ibox->cache,
+			mail->data_pool, &mail->data.all_cache_fields_count);
 }
 
 static void index_mail_parse_finish_imap_envelope(struct index_mail *mail)
--- a/src/lib-storage/index/index-mail.h	Wed Jul 13 00:15:16 2005 +0300
+++ b/src/lib-storage/index/index-mail.h	Wed Jul 13 11:25:24 2005 +0300
@@ -89,6 +89,9 @@
 	int parsing_count;
 	array_t ARRAY_DEFINE(keywords, const char *);
 
+	const struct mail_cache_field *all_cache_fields;
+	unsigned int all_cache_fields_count;
+
 	unsigned int save_sent_date:1;
 	unsigned int save_envelope:1;
 	unsigned int save_bodystructure_header:1;