]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Various optimization fixes to fetching messages' virtual size.
authorTimo Sirainen <tss@iki.fi>
Mon, 4 May 2015 15:31:27 +0000 (18:31 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 4 May 2015 15:31:27 +0000 (18:31 +0300)
src/lib-storage/index/imapc/imapc-mail-fetch.c
src/lib-storage/index/imapc/imapc-mail.c

index 0e812679a310af71c54e58573769c3e817857e7c..42d070198180de56cb32d96b88dde5437450eaa3 100644 (file)
@@ -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)
index ac3969b7ff8dde21c298c2f8748ca45150cd7ec0..665ec53961311a8423719c6712a6b52978aca150 100644 (file)
@@ -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,