changeset 1770:ba17c15b9b40 HEAD

Headers were returned twice sometimes
author Timo Sirainen <tss@iki.fi>
date Wed, 10 Sep 2003 05:07:05 +0300
parents c2ba78db758e
children 63254344ea0e
files src/lib-storage/index/index-mail-headers.c
diffstat 1 files changed, 21 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-mail-headers.c	Wed Sep 10 04:50:26 2003 +0300
+++ b/src/lib-storage/index/index-mail-headers.c	Wed Sep 10 05:07:05 2003 +0300
@@ -470,6 +470,17 @@
 	return TRUE;
 }
 
+static void trash_partial_headers(struct index_mail *mail)
+{
+	struct index_mail_data *data = &mail->data;
+
+	data->header_data_cached_partial = FALSE;
+	data->header_data_cached = data->header_data_cached_contiguous;
+
+	str_truncate(data->header_data, data->header_data_uncached_offset);
+	cached_headers_clear_values(mail);
+}
+
 int index_mail_parse_headers(struct index_mail *mail)
 {
 	struct mail_cache *cache = mail->ibox->index->cache;
@@ -489,13 +500,7 @@
 	if (!data->header_fully_parsed && index_mail_can_cache_headers(mail)) {
 		if (data->header_data_cached_partial) {
 			/* too difficult to handle efficiently, trash it */
-			data->header_data_cached_partial = FALSE;
-			data->header_data_cached =
-				data->header_data_cached_contiguous;
-
-			str_truncate(data->header_data,
-				     data->header_data_uncached_offset);
-			cached_headers_clear_values(mail);
+                        trash_partial_headers(mail);
 		}
 
 		/* add all cached headers to beginning of header_data */
@@ -610,12 +615,17 @@
 
 	i_assert(*minimum_fields != NULL);
 
-	if (mail->data.header_data == NULL)
-		mail->data.header_data = str_new(mail->pool, 4096);
+	if (data->header_data == NULL)
+		data->header_data = str_new(mail->pool, 4096);
 
 	idx = mail_find_wanted_headers(mail, minimum_fields);
 	if (idx >= 0) {
 		/* copy from cache to header_data */
+		if (data->header_data_cached_partial) {
+			/* Some headers may already partially be in
+			   header_data, we don't want them twice */
+			trash_partial_headers(mail);
+		}
 		for (i = data->header_data_cached; i <= idx; i++) {
 			str = mail_cache_lookup_string_field(
 					mail->ibox->index->cache, data->rec,
@@ -626,11 +636,8 @@
 			str_append(data->header_data, str);
 		}
 		data->header_data_cached = idx+1;
-		if (!data->header_data_cached_partial) {
-			data->header_data_uncached_offset =
-				str_len(data->header_data);
-			data->header_data_cached_contiguous = idx+1;
-		}
+		data->header_data_uncached_offset = str_len(data->header_data);
+		data->header_data_cached_contiguous = idx+1;
 	} else {
 		/* it's not cached yet - see if we have them parsed */
 		all_saved = TRUE;