]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: move snippet generation to mail-save-finish
authorJosef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
Sun, 18 Feb 2018 23:06:48 +0000 (18:06 -0500)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 20 Feb 2018 08:21:06 +0000 (10:21 +0200)
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

index 5ca1dd28ac29123cbf268bea083c39fef6188c20..bd70e0519573040bd1dc9a2422871f161717e762 100644 (file)
@@ -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 =