[dovecot-cvs] dovecot/src/lib-storage/index index-mail-headers.c,1.7,1.8 index-mail.h,1.9,1.10 index-search.c,1.78,1.79

cras at procontrol.fi cras at procontrol.fi
Mon Sep 8 06:24:31 EEST 2003


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

Modified Files:
	index-mail-headers.c index-mail.h index-search.c 
Log Message:
Stop parsing cached headers when we've got everything.



Index: index-mail-headers.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail-headers.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- index-mail-headers.c	8 Sep 2003 00:04:59 -0000	1.7
+++ index-mail-headers.c	8 Sep 2003 02:24:29 -0000	1.8
@@ -240,10 +240,15 @@
 	data = buffer_get_modifyable_data(mail->data.headers, &size);
 	size /= sizeof(struct cached_header *);
 
+	mail->data.parsing_count = 0;
 	if (headers == NULL) {
 		/* parsing all headers */
-		for (i = 0; i < size; i++)
-			data[i]->parsing = TRUE;
+		for (i = 0; i < size; i++) {
+			if (!data[i]->fully_saved) {
+				data[i]->parsing = TRUE;
+				mail->data.parsing_count++;
+			}
+		}
 	} else {
 		t_push();
 		headers = sort_array(headers);
@@ -251,7 +256,10 @@
 			cmp = strcasecmp(*headers, data[i]->name);
 			if (cmp <= 0) {
 				if (cmp == 0) {
-					data[i]->parsing = TRUE;
+					if (!data[i]->fully_saved) {
+						data[i]->parsing = TRUE;
+						mail->data.parsing_count++;
+					}
 					i++;
 				}
 				headers++;
@@ -261,12 +269,17 @@
 		}
 		t_pop();
 	}
+
+	if (mail->data.save_sent_date || mail->data.save_envelope) {
+		/* parse the whole header */
+		mail->data.parsing_count = -1;
+	}
 }
 
-void index_mail_parse_header(struct message_part *part,
-			     struct message_header_line *hdr, void *context)
+int index_mail_parse_header(struct message_part *part,
+			    struct message_header_line *hdr,
+			    struct index_mail *mail)
 {
-	struct index_mail *mail = context;
 	struct index_mail_data *data = &mail->data;
 	struct cached_header *cached_hdr;
 	int timezone;
@@ -275,7 +288,7 @@
 		imap_bodystructure_parse_header(mail->pool, part, hdr);
 
 	if (part != NULL && part->parent != NULL)
-		return;
+		return FALSE;
 
 	if (data->save_envelope) {
 		imap_envelope_parse_header(mail->pool,
@@ -306,7 +319,7 @@
 		}
 
 		cached_headers_mark_fully_saved(mail);
-		return;
+		return TRUE;
 	}
 
 	if (data->save_sent_date && strcasecmp(hdr->name, "Date") == 0) {
@@ -341,14 +354,32 @@
 				     hdr->value, hdr->value_len);
 			if (!hdr->no_newline)
 				str_append(data->header_data, "\n");
+			if (!hdr->continues) {
+				cached_hdr->fully_saved = TRUE;
+				data->parsing_count--;
+			}
 		} else {
 			/* it's already in header_data. */
-			if (cached_hdr->value_idx == 0) {
-				cached_hdr->value_idx =
-					data->header_stream->v_offset;
-			}
+			i_assert(cached_hdr->value_idx == 0);
+			cached_hdr->value_idx = data->header_stream->v_offset;
+
+			cached_hdr->fully_saved = TRUE;
+			data->parsing_count--;
 		}
+
+		if (data->parsing_count == 0)
+			return FALSE;
 	}
+	return TRUE;
+}
+
+static void index_mail_parse_header_cb(struct message_part *part,
+				       struct message_header_line *hdr,
+				       void *context)
+{
+	struct index_mail *mail = context;
+
+	(void)index_mail_parse_header(part, hdr, mail);
 }
 
 static int index_mail_can_cache_headers(struct index_mail *mail)
@@ -421,8 +452,17 @@
 	}
 
 	index_mail_parse_header_init(mail, idx_headers);
-	message_parse_header(NULL, istream, NULL,
-			     index_mail_parse_header, mail);
+
+	struct message_header_parser_ctx *hdr_ctx;
+	struct message_header_line *hdr;
+
+	hdr_ctx = message_parse_header_init(istream, NULL);
+	while ((hdr = message_parse_header_next(hdr_ctx)) != NULL) {
+		if (!index_mail_parse_header(NULL, hdr, mail))
+			break;
+	}
+	message_parse_header_deinit(hdr_ctx);
+	index_mail_parse_header(NULL, NULL, mail);
 
 	data->header_stream = NULL;
 	i_stream_unref(istream);
@@ -504,12 +544,12 @@
 
 	if (data->parts != NULL || data->parser_ctx != NULL) {
 		message_parse_header(data->parts, data->stream, &data->hdr_size,
-				     index_mail_parse_header, mail);
+				     index_mail_parse_header_cb, mail);
 	} else {
 		data->parser_ctx =
 			message_parser_init(mail->pool, data->stream);
 		message_parser_parse_header(data->parser_ctx, &data->hdr_size,
-					    index_mail_parse_header, mail);
+					    index_mail_parse_header_cb, mail);
 	}
 	data->hdr_size_set = TRUE;
 

Index: index-mail.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- index-mail.h	21 Aug 2003 00:04:11 -0000	1.9
+++ index-mail.h	8 Sep 2003 02:24:29 -0000	1.10
@@ -31,6 +31,7 @@
 	struct istream *stream;
 	struct message_size hdr_size, body_size;
 	struct message_parser_ctx *parser_ctx;
+	int parsing_count;
 
 	unsigned int parse_header:1;
 	unsigned int bodystructure_header_want:1;
@@ -69,8 +70,9 @@
 
 void index_mail_parse_header_init(struct index_mail *mail,
 				  const char *const headers[]);
-void index_mail_parse_header(struct message_part *part,
-			     struct message_header_line *hdr, void *context);
+int index_mail_parse_header(struct message_part *part,
+			    struct message_header_line *hdr,
+			    struct index_mail *mail);
 
 int index_mail_cache_transaction_begin(struct index_mail *mail);
 void index_mail_cache_add(struct index_mail *mail, enum mail_cache_field field,

Index: index-search.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-search.c,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- index-search.c	6 Aug 2003 20:15:33 -0000	1.78
+++ index-search.c	8 Sep 2003 02:24:29 -0000	1.79
@@ -482,7 +482,7 @@
 	if (hdr->eoh)
 		return;
 
-	index_mail_parse_header(part, hdr, ctx->index_context->mail);
+	index_mail_parse_header(part, hdr, &ctx->index_context->imail);
 
 	if (ctx->custom_header || strcasecmp(hdr->name, "Date") == 0) {
 		ctx->hdr = hdr;



More information about the dovecot-cvs mailing list