From: Timo Sirainen Date: Mon, 24 Apr 2017 10:27:43 +0000 (+0300) Subject: lib-storage: Add mail_storage.nonbody_access_fields X-Git-Tag: 2.3.0.rc1~1705 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=afe1da042382720393eca6497253106e4eec75e0;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add mail_storage.nonbody_access_fields This avoids index_mail_update_access_parts_pre() from opening the mail stream unnecessarily for fields that can be looked up via other methods by the storage. --- diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index b6c86b47ca..836567687d 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1733,6 +1733,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail) { struct index_mail *mail = (struct index_mail *)_mail; struct index_mail_data *data = &mail->data; + struct mail_storage *storage = _mail->box->storage; const struct mail_cache_field *cache_fields = mail->ibox->cache_fields; struct mail_cache_view *cache_view = _mail->transaction->cache_view; @@ -1763,6 +1764,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail) /* see if wanted_fields can tell us if we need to read/parse header/body */ if ((data->wanted_fields & MAIL_FETCH_MESSAGE_PARTS) != 0 && + (storage->nonbody_access_fields & MAIL_FETCH_MESSAGE_PARTS) == 0 && data->parts == NULL) { const unsigned int cache_field = cache_fields[MAIL_CACHE_MESSAGE_PARTS].idx; @@ -1775,11 +1777,13 @@ void index_mail_update_access_parts_pre(struct mail *_mail) } if ((data->wanted_fields & MAIL_FETCH_IMAP_ENVELOPE) != 0 && + (storage->nonbody_access_fields & MAIL_FETCH_IMAP_ENVELOPE) == 0 && data->envelope == NULL) check_envelope(mail); if ((data->wanted_fields & MAIL_FETCH_IMAP_BODY) != 0 && (data->cache_flags & MAIL_CACHE_FLAG_TEXT_PLAIN_7BIT_ASCII) == 0 && + (storage->nonbody_access_fields & MAIL_FETCH_IMAP_BODY) == 0 && data->body == NULL) { /* we need either imap.body or imap.bodystructure */ const unsigned int cache_field1 = @@ -1799,6 +1803,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail) if ((data->wanted_fields & MAIL_FETCH_IMAP_BODYSTRUCTURE) != 0 && (data->cache_flags & MAIL_CACHE_FLAG_TEXT_PLAIN_7BIT_ASCII) == 0 && + (storage->nonbody_access_fields & MAIL_FETCH_IMAP_BODYSTRUCTURE) == 0 && data->bodystructure == NULL) { const unsigned int cache_field = cache_fields[MAIL_CACHE_IMAP_BODYSTRUCTURE].idx; @@ -1812,6 +1817,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail) } if ((data->wanted_fields & MAIL_FETCH_DATE) != 0 && + (storage->nonbody_access_fields & MAIL_FETCH_DATE) == 0 && data->sent_date.time == (uint32_t)-1) { const unsigned int cache_field = cache_fields[MAIL_CACHE_SENT_DATE].idx; @@ -1822,7 +1828,8 @@ void index_mail_update_access_parts_pre(struct mail *_mail) data->save_sent_date = TRUE; } } - if ((data->wanted_fields & MAIL_FETCH_BODY_SNIPPET) != 0) { + if ((data->wanted_fields & MAIL_FETCH_BODY_SNIPPET) != 0 && + (storage->nonbody_access_fields & MAIL_FETCH_BODY_SNIPPET) == 0) { const unsigned int cache_field = cache_fields[MAIL_CACHE_BODY_SNIPPET].idx; diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index d886f44597..8903c5de9d 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -110,6 +110,11 @@ struct mail_storage_error { struct mail_storage { const char *name; enum mail_storage_class_flags class_flags; + /* Fields that the storage backend can get by other means than parsing + the message header/body. For example the imapc backend can lookup + MAIL_FETCH_IMAP_BODYSTRUCTURE from the remote server. Adding fields + here avoids adding them to index_mail_data.access_part. */ + enum mail_fetch_field nonbody_access_fields; struct mail_storage_vfuncs v, *vlast;