From: Timo Sirainen Date: Sat, 16 Nov 2013 18:10:27 +0000 (+0200) Subject: imapc: When sending FETCH, always request also missing wanted_fields. X-Git-Tag: 2.2.8~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d02af9610cf5d6560c5ebf4491f59eca2ba810a8;p=thirdparty%2Fdovecot%2Fcore.git imapc: When sending FETCH, always request also missing wanted_fields. This avoids sending multiple FETCH commands when prefetch hadn't already fetched everything. --- diff --git a/src/lib-storage/index/imapc/imapc-mail-fetch.c b/src/lib-storage/index/imapc/imapc-mail-fetch.c index 967d1bff9f..2599ffb0f4 100644 --- a/src/lib-storage/index/imapc/imapc-mail-fetch.c +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c @@ -207,19 +207,14 @@ static void imapc_mail_cache_get(struct imapc_mail *mail, imapc_mail_init_stream(mail, TRUE); } -bool imapc_mail_prefetch(struct mail *_mail) +static enum mail_fetch_field +imapc_mail_get_wanted_fetch_fields(struct imapc_mail *mail) { - struct imapc_mail *mail = (struct imapc_mail *)_mail; - struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box; + struct imapc_mailbox *mbox = + (struct imapc_mailbox *)mail->imail.mail.mail.box; struct index_mail_data *data = &mail->imail.data; enum mail_fetch_field fields = 0; - if (mbox->prev_mail_cache.uid == _mail->uid) - imapc_mail_cache_get(mail, &mbox->prev_mail_cache); - - /* try to get as much from cache as possible */ - imapc_mail_update_access_parts(&mail->imail); - if ((data->wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0 && data->received_date == (time_t)-1) fields |= MAIL_FETCH_RECEIVED_DATE; @@ -240,6 +235,22 @@ bool imapc_mail_prefetch(struct mail *_mail) else fields |= MAIL_FETCH_STREAM_HEADER; } + return fields; +} + +bool imapc_mail_prefetch(struct mail *_mail) +{ + struct imapc_mail *mail = (struct imapc_mail *)_mail; + struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box; + struct index_mail_data *data = &mail->imail.data; + enum mail_fetch_field fields; + + if (mbox->prev_mail_cache.uid == _mail->uid) + imapc_mail_cache_get(mail, &mbox->prev_mail_cache); + /* try to get as much from cache as possible */ + imapc_mail_update_access_parts(&mail->imail); + + fields = imapc_mail_get_wanted_fetch_fields(mail); if (fields != 0) T_BEGIN { (void)imapc_mail_send_fetch(_mail, fields, data->wanted_headers == NULL ? NULL : @@ -292,6 +303,7 @@ int imapc_mail_fetch(struct mail *_mail, enum mail_fetch_field fields, return -1; } + fields |= imapc_mail_get_wanted_fetch_fields(imail); T_BEGIN { ret = imapc_mail_send_fetch(_mail, fields, headers); } T_END;