]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: maildir_uidlist_lookup() -> maildir_sync_lookup() refactoring.
authorTimo Sirainen <tss@iki.fi>
Sun, 5 Dec 2010 21:05:40 +0000 (21:05 +0000)
committerTimo Sirainen <tss@iki.fi>
Sun, 5 Dec 2010 21:05:40 +0000 (21:05 +0000)
src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/index/maildir/maildir-sync.c
src/lib-storage/index/maildir/maildir-sync.h
src/lib-storage/index/maildir/maildir-uidlist.c
src/lib-storage/index/maildir/maildir-uidlist.h
src/lib-storage/index/maildir/maildir-util.c

index 7378dcd80de6140d7963004505b2f57dd12e16f5..7471d00586038980b8ea7efeabfb7ea3177c4882 100644 (file)
@@ -188,7 +188,7 @@ maildir_mail_get_fname(struct maildir_mailbox *mbox, struct mail *mail,
        bool exists;
        int ret;
 
-       ret = maildir_uidlist_lookup(mbox->uidlist, mail->uid, &flags, fname_r);
+       ret = maildir_sync_lookup(mbox, mail->uid, &flags, fname_r);
        if (ret != 0)
                return ret;
 
@@ -588,8 +588,7 @@ static void maildir_mail_set_cache_corrupted(struct mail *_mail,
        if (field == MAIL_FETCH_VIRTUAL_SIZE) {
                /* make sure it gets removed from uidlist.
                   if it's in file name, we can't really do more than log it. */
-               ret = maildir_uidlist_lookup(mbox->uidlist, _mail->uid,
-                                            &flags, &fname);
+               ret = maildir_sync_lookup(mbox, _mail->uid, &flags, &fname);
                if (ret <= 0)
                        return;
                if (maildir_filename_get_size(fname, MAILDIR_EXTRA_VIRTUAL_SIZE,
index 0a7b224ae84f1d2dc310330a56521a2816ff0b3f..abfc14968f7a4d9e5305d51ddbe11a9aff06fadb 100644 (file)
@@ -881,8 +881,8 @@ static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced,
        }
 
        if (find_uid != NULL && *find_uid != 0) {
-               ret = maildir_uidlist_lookup_nosync(ctx->mbox->uidlist,
-                                                   *find_uid, &flags, &fname);
+               ret = maildir_uidlist_lookup(ctx->mbox->uidlist,
+                                            *find_uid, &flags, &fname);
                if (ret < 0)
                        return -1;
                if (ret == 0) {
@@ -897,6 +897,35 @@ static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced,
        return maildir_uidlist_sync_deinit(&ctx->uidlist_sync_ctx, TRUE);
 }
 
+int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid,
+                       enum maildir_uidlist_rec_flag *flags_r,
+                       const char **fname_r)
+{
+       int ret;
+
+       ret = maildir_uidlist_lookup(mbox->uidlist, uid, flags_r, fname_r);
+       if (ret <= 0) {
+               if (ret < 0)
+                       return -1;
+               if (maildir_uidlist_is_open(mbox->uidlist)) {
+                       /* refresh uidlist and check again in case it was added
+                          after the last mailbox sync */
+                       if (maildir_uidlist_refresh(mbox->uidlist) < 0)
+                               return -1;
+               } else {
+                       /* the uidlist doesn't exist. */
+                       if (maildir_storage_sync_force(mbox, uid) < 0)
+                               return -1;
+               }
+
+               /* try again */
+               ret = maildir_uidlist_lookup(mbox->uidlist, uid,
+                                            flags_r, fname_r);
+       }
+
+       return ret;
+}
+
 int maildir_storage_sync_force(struct maildir_mailbox *mbox, uint32_t uid)
 {
         struct maildir_sync_context *ctx;
index a9d6c8a27fe002e64a6ac12790bfaddbe4f4d62f..83217fc461884f456805cbf5ab928db3d7f58756 100644 (file)
@@ -42,6 +42,10 @@ void maildir_sync_notify(struct maildir_sync_context *ctx);
 void maildir_sync_set_new_msgs_count(struct maildir_index_sync_context *ctx,
                                     unsigned int count);
 
+int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid,
+                       enum maildir_uidlist_rec_flag *flags_r,
+                       const char **fname_r);
+
 int maildir_list_index_has_changed(struct mailbox *box,
                                   struct mail_index_view *list_view,
                                   uint32_t seq);
index 3e69b3eebb2de7fb3d6372fb9e4efc8b1b02dc42..f113af64a1a3c4ec7b8ddd1688c6cb1519a78ddb 100644 (file)
@@ -36,7 +36,6 @@
 #include "nfs-workarounds.h"
 #include "eacces-error.h"
 #include "maildir-storage.h"
-#include "maildir-sync.h"
 #include "maildir-filename.h"
 #include "maildir-uidlist.h"
 
@@ -232,6 +231,11 @@ bool maildir_uidlist_is_read(struct maildir_uidlist *uidlist)
        return uidlist->initial_read;
 }
 
+bool maildir_uidlist_is_open(struct maildir_uidlist *uidlist)
+{
+       return uidlist->fd != -1;
+}
+
 void maildir_uidlist_unlock(struct maildir_uidlist *uidlist)
 {
        i_assert(uidlist->lock_count > 0);
@@ -1027,35 +1031,6 @@ maildir_uidlist_lookup_rec(struct maildir_uidlist *uidlist, uint32_t uid,
 int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid,
                           enum maildir_uidlist_rec_flag *flags_r,
                           const char **fname_r)
-{
-       int ret;
-
-       ret = maildir_uidlist_lookup_nosync(uidlist, uid, flags_r, fname_r);
-       if (ret <= 0) {
-               if (ret < 0)
-                       return -1;
-               if (uidlist->fd != -1 || uidlist->mbox == NULL) {
-                       /* refresh uidlist and check again in case it was added
-                          after the last mailbox sync */
-                       if (maildir_uidlist_refresh(uidlist) < 0)
-                               return -1;
-               } else {
-                       /* the uidlist doesn't exist. */
-                       if (maildir_storage_sync_force(uidlist->mbox, uid) < 0)
-                               return -1;
-               }
-
-               /* try again */
-               ret = maildir_uidlist_lookup_nosync(uidlist, uid,
-                                                   flags_r, fname_r);
-       }
-
-       return ret;
-}
-
-int maildir_uidlist_lookup_nosync(struct maildir_uidlist *uidlist, uint32_t uid,
-                                 enum maildir_uidlist_rec_flag *flags_r,
-                                 const char **fname_r)
 {
        struct maildir_uidlist_rec *rec;
        int ret;
index 614a5e2822bb29698e975c7c9d989b454e91985a..19d66b914e95be2fbff92733e881fa5bef1ee59a 100644 (file)
@@ -56,6 +56,8 @@ int maildir_uidlist_lock_touch(struct maildir_uidlist *uidlist);
 void maildir_uidlist_unlock(struct maildir_uidlist *uidlist);
 bool maildir_uidlist_is_locked(struct maildir_uidlist *uidlist);
 bool maildir_uidlist_is_read(struct maildir_uidlist *uidlist);
+/* Returns TRUE if uidlist file is currently open */
+bool maildir_uidlist_is_open(struct maildir_uidlist *uidlist);
 
 struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox);
 void maildir_uidlist_deinit(struct maildir_uidlist **uidlist);
@@ -73,9 +75,6 @@ int maildir_uidlist_refresh_fast_init(struct maildir_uidlist *uidlist);
 int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid,
                           enum maildir_uidlist_rec_flag *flags_r,
                           const char **fname_r);
-int maildir_uidlist_lookup_nosync(struct maildir_uidlist *uidlist, uint32_t uid,
-                                 enum maildir_uidlist_rec_flag *flags_r,
-                                 const char **fname_r);
 /* Returns extension's value or NULL if it doesn't exist. */
 const char *
 maildir_uidlist_lookup_ext(struct maildir_uidlist *uidlist, uint32_t uid,
index a17e41a61694b3f0ddb5b200dfc43ef3b6b0493a..685d95c8b9f756550636e609ed9d2c53e55383c6 100644 (file)
@@ -61,7 +61,7 @@ static int maildir_file_do_try(struct maildir_mailbox *mbox, uint32_t uid,
        bool have_flags;
        int ret;
 
-       ret = maildir_uidlist_lookup(mbox->uidlist, uid, &flags, &fname);
+       ret = maildir_sync_lookup(mbox, uid, &flags, &fname);
        if (ret <= 0)
                return ret == 0 ? -2 : -1;