[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