From: Timo Sirainen Date: Mon, 4 May 2015 15:31:27 +0000 (+0300) Subject: imapc: Various optimization fixes to fetching messages' virtual size. X-Git-Tag: 2.2.17.rc1~109 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50ffc12831eff618d35a8ee7537b61eaa95a4ade;p=thirdparty%2Fdovecot%2Fcore.git imapc: Various optimization fixes to fetching messages' virtual size. --- diff --git a/src/lib-storage/index/imapc/imapc-mail-fetch.c b/src/lib-storage/index/imapc/imapc-mail-fetch.c index 0e812679a3..42d0701981 100644 --- a/src/lib-storage/index/imapc/imapc-mail-fetch.c +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c @@ -212,7 +212,7 @@ imapc_mail_send_fetch(struct mail *_mail, enum mail_fetch_field fields, 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 @@ imapc_mail_get_wanted_fetch_fields(struct imapc_mail *mail) 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 @@ imapc_mail_have_fields(struct imapc_mail *imail, enum mail_fetch_field fields) 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) diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index ac3969b7ff..665ec53961 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -125,12 +125,11 @@ static int imapc_mail_get_physical_size(struct mail *_mail, uoff_t *size_r) 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 @@ static int imapc_mail_get_physical_size(struct mail *_mail, uoff_t *size_r) 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 @@ void imapc_mail_update_access_parts(struct index_mail *mail) 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 @@ struct mail_vfuncs imapc_mail_vfuncs = { 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,