]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Set virtual/physical size in dest_mail when copying, if possible.
authorTimo Sirainen <tss@iki.fi>
Thu, 18 Apr 2013 14:54:29 +0000 (17:54 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 18 Apr 2013 14:54:29 +0000 (17:54 +0300)
Ideally lib-index would be fixed so this wouldn't be necessary. The
lib-index way of fixing it would also be useful for more than just quota
plugin.

src/lib-storage/index/index-storage.c

index 047ae6c5df435d4b984f7a531e71862d6bb33288..a4c1061c2bca96dc1114eabc68d43f205a2966d3 100644 (file)
@@ -795,6 +795,23 @@ mail_copy_cache_field(struct mail_save_context *ctx, struct mail *src_mail,
                if (mail_cache_lookup_field(src_mail->transaction->cache_view, buf,
                                            src_mail->seq, src_field_idx) <= 0)
                        buffer_set_used_size(buf, 0);
+               else if (ctx->dest_mail != NULL &&
+                        (strcmp(name, "size.physical") == 0 ||
+                         strcmp(name, "size.virtual") == 0)) {
+                       /* FIXME: until mail_cache_lookup() can read unwritten
+                          cached data from buffer, we'll do this optimization
+                          to make quota plugin's work faster */
+                       struct index_mail *imail =
+                               (struct index_mail *)ctx->dest_mail;
+                       uoff_t size;
+
+                       i_assert(buf->used == sizeof(size));
+                       memcpy(&size, buf->data, sizeof(size));
+                       if (strcmp(name, "size.physical") == 0)
+                               imail->data.physical_size = size;
+                       else
+                               imail->data.virtual_size = size;
+               }
        }
        if (buf->used > 0) {
                mail_cache_add(dest_trans->cache_trans, dest_seq,