dovecot-2.2: imapc: When sending FETCH, always request also miss...

dovecot at dovecot.org dovecot at dovecot.org
Sat Nov 16 20:10:36 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/0c9b17f7cadf
changeset: 16962:0c9b17f7cadf
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Nov 16 20:10:27 2013 +0200
description:
imapc: When sending FETCH, always request also missing wanted_fields.
This avoids sending multiple FETCH commands when prefetch hadn't already
fetched everything.

diffstat:

 src/lib-storage/index/imapc/imapc-mail-fetch.c |  30 ++++++++++++++++++-------
 1 files changed, 21 insertions(+), 9 deletions(-)

diffs (58 lines):

diff -r 4597e6572ba1 -r 0c9b17f7cadf src/lib-storage/index/imapc/imapc-mail-fetch.c
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Sat Nov 16 20:09:19 2013 +0200
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Sat Nov 16 20:10:27 2013 +0200
@@ -207,19 +207,14 @@
 	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 @@
 		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 @@
 		return -1;
 	}
 
+	fields |= imapc_mail_get_wanted_fetch_fields(imail);
 	T_BEGIN {
 		ret = imapc_mail_send_fetch(_mail, fields, headers);
 	} T_END;


More information about the dovecot-cvs mailing list