]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: Fixed looking up physical size for a mail while it's being saved.
authorTimo Sirainen <tss@iki.fi>
Tue, 18 Mar 2014 14:49:10 +0000 (16:49 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 18 Mar 2014 14:49:10 +0000 (16:49 +0200)
Based on patch by Teemu Huovila.

src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/index/maildir/maildir-save.c
src/lib-storage/index/maildir/maildir-storage.h

index 918a2d65d3e2ac93d97cc4f9e4cf3bc9343d7a00..8c4fade6f44858cf4eb3ce106b3ae8dcc2e277de 100644 (file)
@@ -288,6 +288,10 @@ static int maildir_quick_size_lookup(struct index_mail *mail, bool vsize,
                if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
                        return -1;
        } else {
+               if (maildir_save_file_get_size(_mail->transaction, _mail->seq,
+                                              vsize, size_r) == 0)
+                       return 1;
+
                path = maildir_save_file_get_path(_mail->transaction,
                                                  _mail->seq);
                fname = strrchr(path, '/');
index 113d0228a2eac8c1340f538db880c21aaa675f4c..24c2f4883a5a585f0b988418b4e9d12ff7b514a6 100644 (file)
@@ -304,8 +304,9 @@ static const char *maildir_mf_get_path(struct maildir_save_context *ctx,
        return t_strdup_printf("%s/%s", dir, fname);
 }
 
-const char *maildir_save_file_get_path(struct mailbox_transaction_context *t,
-                                      uint32_t seq)
+
+static struct maildir_filename *
+maildir_save_get_mf(struct mailbox_transaction_context *t, uint32_t seq)
 {
        struct maildir_save_context *save_ctx =
                (struct maildir_save_context *)t->save_ctx;
@@ -320,6 +321,24 @@ const char *maildir_save_file_get_path(struct mailbox_transaction_context *t,
                i_assert(mf != NULL);
                seq--;
        }
+       return mf;
+}
+
+int maildir_save_file_get_size(struct mailbox_transaction_context *t,
+                              uint32_t seq, bool vsize, uoff_t *size_r)
+{
+       struct maildir_filename *mf = maildir_save_get_mf(t, seq);
+
+       *size_r = vsize ? mf->vsize : mf->size;
+       return *size_r == (uoff_t)-1 ? -1 : 0;
+}
+
+const char *maildir_save_file_get_path(struct mailbox_transaction_context *t,
+                                      uint32_t seq)
+{
+       struct maildir_save_context *save_ctx =
+               (struct maildir_save_context *)t->save_ctx;
+       struct maildir_filename *mf = maildir_save_get_mf(t, seq);
 
        return maildir_mf_get_path(save_ctx, mf);
 }
index cb20b2b90768b37a27a7ebc1ed1b35d8ba5919ec..937c0d2ac235d1b6b0bad7f842be4d315ebacce8 100644 (file)
@@ -126,6 +126,9 @@ void maildir_save_set_dest_basename(struct mail_save_context *ctx,
                                    const char *basename);
 void maildir_save_set_sizes(struct maildir_filename *mf,
                            uoff_t size, uoff_t vsize);
+
+int maildir_save_file_get_size(struct mailbox_transaction_context *t,
+                              uint32_t seq, bool vsize, uoff_t *size_r);
 const char *maildir_save_file_get_path(struct mailbox_transaction_context *t,
                                       uint32_t seq);