From d175ef52b6ee6b891b7d74d2423fd0efb46a50a3 Mon Sep 17 00:00:00 2001 From: Josef 'Jeff' Sipek Date: Sun, 18 Feb 2018 18:06:48 -0500 Subject: [PATCH] lib-storage: move snippet generation to mail-save-finish This is necessary because some storage backends (most notably sdbox) do not allow getting the mail stream before the mail is fully written out. (See written_to_disk in sdbox-file.h.) If we could avoid getting the stream to generate a snippet we could leave this where it is. --- src/lib-storage/index/index-mail.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 5ca1dd28ac..bd70e05195 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -71,6 +71,7 @@ struct mail_cache_field global_cache_fields[MAIL_INDEX_CACHE_FIELD_COUNT] = { static void index_mail_init_data(struct index_mail *mail); static int index_mail_parse_body(struct index_mail *mail, enum index_cache_field field); +static int index_mail_write_body_snippet(struct index_mail *mail); int index_mail_cache_lookup_field(struct index_mail *mail, buffer_t *buf, unsigned int field_idx) @@ -860,8 +861,14 @@ index_mail_want_cache(struct index_mail *mail, enum index_cache_field field) } } -static void index_mail_body_parsed_cache_body_snippet(struct index_mail *mail) +static void index_mail_save_finish_make_snippet(struct index_mail *mail) { + if (mail->data.save_body_snippet) { + if (index_mail_write_body_snippet(mail) < 0) + return; + mail->data.save_body_snippet = FALSE; + } + if (mail->data.body_snippet != NULL && index_mail_want_cache(mail, MAIL_CACHE_BODY_SNIPPET)) { index_mail_cache_add(mail, MAIL_CACHE_BODY_SNIPPET, @@ -1092,11 +1099,6 @@ index_mail_parse_body_finish(struct index_mail *mail, mail->data.save_bodystructure_body = FALSE; i_assert(mail->data.parts != NULL); } - if (mail->data.save_body_snippet) { - if (index_mail_write_body_snippet(mail) < 0) - return -1; - mail->data.save_body_snippet = FALSE; - } if (mail->data.no_caching) { /* if we're here because we aborted parsing, don't get any @@ -1110,7 +1112,6 @@ index_mail_parse_body_finish(struct index_mail *mail, index_mail_body_parsed_cache_flags(mail); index_mail_body_parsed_cache_message_parts(mail); index_mail_body_parsed_cache_bodystructure(mail, field); - index_mail_body_parsed_cache_body_snippet(mail); index_mail_cache_sizes(mail); index_mail_cache_dates(mail); return 0; @@ -1358,6 +1359,15 @@ static int index_mail_parse_bodystructure(struct index_mail *mail, } break; case MAIL_CACHE_BODY_SNIPPET: + if (data->body_snippet == NULL) { + if (index_mail_write_body_snippet(mail) < 0) + return -1; + + if (index_mail_want_cache(mail, MAIL_CACHE_BODY_SNIPPET)) + index_mail_cache_add(mail, MAIL_CACHE_BODY_SNIPPET, + mail->data.body_snippet, + strlen(mail->data.body_snippet) + 1); + } i_assert(data->body_snippet != NULL && data->body_snippet[0] != '\0'); break; @@ -2369,6 +2379,8 @@ void index_mail_save_finish(struct mail_save_context *ctx) { struct index_mail *imail = (struct index_mail *)ctx->dest_mail; + index_mail_save_finish_make_snippet(imail); + if (ctx->data.from_envelope != NULL && imail->data.from_envelope == NULL) { imail->data.from_envelope =