Mercurial > dovecot > core-2.2
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,