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;