Mercurial > dovecot > core-2.2
changeset 12514:a803cd10b19c
maildir: maildir_uidlist_lookup() -> maildir_sync_lookup() refactoring.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 05 Dec 2010 21:05:40 +0000 |
parents | 485ed7702ce2 |
children | 820d370eb2fe |
files | 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 |
diffstat | 6 files changed, 45 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-mail.c Fri Dec 03 19:38:02 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-mail.c Sun Dec 05 21:05:40 2010 +0000 @@ -188,7 +188,7 @@ 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 @@ 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,
--- a/src/lib-storage/index/maildir/maildir-sync.c Fri Dec 03 19:38:02 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-sync.c Sun Dec 05 21:05:40 2010 +0000 @@ -881,8 +881,8 @@ } 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 @@ 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;
--- a/src/lib-storage/index/maildir/maildir-sync.h Fri Dec 03 19:38:02 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-sync.h Sun Dec 05 21:05:40 2010 +0000 @@ -42,6 +42,10 @@ 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);
--- a/src/lib-storage/index/maildir/maildir-uidlist.c Fri Dec 03 19:38:02 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-uidlist.c Sun Dec 05 21:05:40 2010 +0000 @@ -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 @@ 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); @@ -1028,35 +1032,6 @@ 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;
--- a/src/lib-storage/index/maildir/maildir-uidlist.h Fri Dec 03 19:38:02 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-uidlist.h Sun Dec 05 21:05:40 2010 +0000 @@ -56,6 +56,8 @@ 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_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,
--- a/src/lib-storage/index/maildir/maildir-util.c Fri Dec 03 19:38:02 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-util.c Sun Dec 05 21:05:40 2010 +0000 @@ -61,7 +61,7 @@ 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;