[dovecot-cvs] dovecot/src/lib-storage/index index-mail-headers.c,1.9,1.10

cras at procontrol.fi cras at procontrol.fi
Wed Sep 10 06:07:07 EEST 2003


Update of /home/cvs/dovecot/src/lib-storage/index
In directory danu:/tmp/cvs-serv6353/lib-storage/index

Modified Files:
	index-mail-headers.c 
Log Message:
Headers were returned twice sometimes



Index: index-mail-headers.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail-headers.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- index-mail-headers.c	10 Sep 2003 01:50:26 -0000	1.9
+++ index-mail-headers.c	10 Sep 2003 02:07:05 -0000	1.10
@@ -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;



More information about the dovecot-cvs mailing list