changeset 18512:d350a23207c2

imapc: Various optimization fixes to fetching messages' virtual size.
author Timo Sirainen <tss@iki.fi>
date Mon, 04 May 2015 18:31:27 +0300
parents 8f20aa806bcc
children 8c49fb6d789b
files src/lib-storage/index/imapc/imapc-mail-fetch.c src/lib-storage/index/imapc/imapc-mail.c
diffstat 2 files changed, 24 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Mon May 04 18:15:00 2015 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Mon May 04 18:31:27 2015 +0300
@@ -212,7 +212,7 @@
 	str_printfa(str, "UID FETCH %u (", _mail->uid);
 	if ((fields & MAIL_FETCH_RECEIVED_DATE) != 0)
 		str_append(str, "INTERNALDATE ");
-	if ((fields & MAIL_FETCH_PHYSICAL_SIZE) != 0)
+	if ((fields & (MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE)) != 0)
 		str_append(str, "RFC822.SIZE ");
 	if ((fields & MAIL_FETCH_GUID) != 0) {
 		str_append(str, mbox->guid_fetch_field_name);
@@ -296,10 +296,11 @@
 	if ((data->wanted_fields & MAIL_FETCH_SAVE_DATE) != 0 &&
 	    data->save_date == (time_t)-1 && data->received_date == (time_t)-1)
 		fields |= MAIL_FETCH_RECEIVED_DATE;
-	if ((data->wanted_fields & MAIL_FETCH_PHYSICAL_SIZE) != 0 &&
+	if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
+				    MAIL_FETCH_VIRTUAL_SIZE)) != 0 &&
 	    data->physical_size == (uoff_t)-1 &&
 	    IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE))
-		fields |= MAIL_FETCH_PHYSICAL_SIZE;
+		fields |= MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE;
 	if ((data->wanted_fields & MAIL_FETCH_GUID) != 0 &&
 	    data->guid == NULL && mbox->guid_fetch_field_name != NULL)
 		fields |= MAIL_FETCH_GUID;
@@ -343,10 +344,10 @@
 			return FALSE;
 		fields &= ~MAIL_FETCH_RECEIVED_DATE;
 	}
-	if ((fields & MAIL_FETCH_PHYSICAL_SIZE) != 0) {
+	if ((fields & (MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE)) != 0) {
 		if (imail->imail.data.physical_size == (uoff_t)-1)
 			return FALSE;
-		fields &= ~MAIL_FETCH_PHYSICAL_SIZE;
+		fields &= ~(MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE);
 	}
 	if ((fields & MAIL_FETCH_GUID) != 0) {
 		if (imail->imail.data.guid == NULL)
--- a/src/lib-storage/index/imapc/imapc-mail.c	Mon May 04 18:15:00 2015 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Mon May 04 18:31:27 2015 +0300
@@ -125,12 +125,11 @@
 	uoff_t old_offset;
 	int ret;
 
-	if (data->physical_size == (uoff_t)-1) {
+	if (data->physical_size == (uoff_t)-1)
 		(void)index_mail_get_physical_size(_mail, size_r);
-		if (data->physical_size != (uoff_t)-1) {
-			*size_r = data->physical_size;
-			return 0;
-		}
+	if (data->physical_size != (uoff_t)-1) {
+		*size_r = data->physical_size;
+		return 0;
 	}
 
 	if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE) &&
@@ -164,6 +163,17 @@
 	return 0;
 }
 
+static int imapc_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+	struct index_mail_data *data = &mail->data;
+
+	if (imapc_mail_get_physical_size(_mail, size_r) < 0)
+		return -1;
+	data->virtual_size = data->physical_size;
+	return 0;
+}
+
 static int
 imapc_mail_get_header_stream(struct mail *_mail,
 			     struct mailbox_header_lookup_ctx *headers,
@@ -302,7 +312,8 @@
 			data->save_date = data->received_date;
 		}
 	}
-	if ((data->wanted_fields & MAIL_FETCH_PHYSICAL_SIZE) != 0) {
+	if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
+				    MAIL_FETCH_VIRTUAL_SIZE)) != 0) {
 		if (index_mail_get_physical_size(_mail, &size) < 0 &&
 		    !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE))
 			data->access_part |= READ_HDR | READ_BODY;
@@ -532,7 +543,7 @@
 	index_mail_get_date,
 	imapc_mail_get_received_date,
 	imapc_mail_get_save_date,
-	imapc_mail_get_physical_size,
+	imapc_mail_get_virtual_size,
 	imapc_mail_get_physical_size,
 	imapc_mail_get_first_header,
 	imapc_mail_get_headers,