[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-copy.c, 1.40, 1.41 maildir-save.c, 1.61, 1.62 maildir-storage.h, 1.42, 1.43 maildir-sync.c, 1.67, 1.68

cras at dovecot.org cras at dovecot.org
Fri Dec 30 21:12:49 EET 2005


Update of /var/lib/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv4566/index/maildir

Modified Files:
	maildir-copy.c maildir-save.c maildir-storage.h maildir-sync.c 
Log Message:
maildir_copy_with_hardlinks works again.



Index: maildir-copy.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-copy.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- maildir-copy.c	7 Oct 2005 09:34:12 -0000	1.40
+++ maildir-copy.c	30 Dec 2005 19:12:46 -0000	1.41
@@ -4,6 +4,8 @@
 #include "array.h"
 #include "ioloop.h"
 #include "maildir-storage.h"
+#include "maildir-uidlist.h"
+#include "maildir-keywords.h"
 #include "index-mail.h"
 #include "mail-copy.h"
 
@@ -14,6 +16,9 @@
 	struct maildir_mailbox *mbox;
 	int hardlink;
 
+        struct maildir_uidlist_sync_ctx *uidlist_sync_ctx;
+	struct maildir_keywords_sync_ctx *keywords_sync_ctx;
+
 	pool_t pool;
 	struct rollback *rollbacks;
 };
@@ -61,29 +66,57 @@
 		      struct maildir_copy_context *ctx)
 {
 	struct index_mail *imail = (struct index_mail *)mail;
-	struct maildir_mailbox *mbox = (struct maildir_mailbox *)imail->ibox;
+	struct maildir_mailbox *dest_mbox = ctx->mbox;
+	struct maildir_mailbox *src_mbox =
+		(struct maildir_mailbox *)imail->ibox;
 	struct hardlink_ctx do_ctx;
 	struct rollback *rb;
 	const char *dest_fname;
+	unsigned int keywords_count;
 	array_t ARRAY_DEFINE(keywords_arr, unsigned int);
 
 	dest_fname = maildir_generate_tmp_filename(&ioloop_timeval);
 
-	if (keywords->count > 0) {
+	keywords_count = keywords == NULL ? 0 : keywords->count;
+	if (keywords_count > 0) {
 		ARRAY_CREATE(&keywords_arr, pool_datastack_create(),
 			     unsigned int, keywords->count);
 		array_append(&keywords_arr, keywords->idx, keywords->count);
+
+		if (ctx->keywords_sync_ctx == NULL) {
+			/* uidlist must be locked while accessing
+			   keywords files */
+			if (maildir_uidlist_sync_init(dest_mbox->uidlist, TRUE,
+						&ctx->uidlist_sync_ctx) <= 0) {
+				/* error or timeout */
+				return -1;
+			}
+
+			ctx->keywords_sync_ctx =
+				maildir_keywords_sync_init(dest_mbox->keywords,
+							dest_mbox->ibox.index);
+		}
 	}
-	dest_fname = maildir_filename_set_flags(NULL, // FIXME: !!!
+
+	flags &= ~MAIL_RECENT;
+	if (dest_mbox->ibox.keep_recent)
+		flags |= MAIL_RECENT;
+
+	dest_fname = maildir_filename_set_flags(ctx->keywords_sync_ctx,
 						dest_fname, flags,
-						keywords->count != 0 ?
+						keywords_count != 0 ?
 						&keywords_arr : NULL);
 
+	if (keywords_count == 0 && flags == MAIL_RECENT)
+		dest_fname = t_strconcat("new/", dest_fname, NULL);
+	else
+		dest_fname = t_strconcat("cur/", dest_fname, NULL);
+
 	memset(&do_ctx, 0, sizeof(do_ctx));
 	do_ctx.dest_path =
-		t_strconcat(ctx->mbox->path, "/new/", dest_fname, NULL);
+		t_strconcat(dest_mbox->path, "/", dest_fname, NULL);
 
-	if (maildir_file_do(mbox, imail->mail.mail.uid,
+	if (maildir_file_do(src_mbox, imail->mail.mail.uid,
 			    do_hardlink, &do_ctx) < 0)
 		return -1;
 
@@ -108,13 +141,17 @@
 
 	ctx = p_new(pool, struct maildir_copy_context, 1);
 	ctx->pool = pool;
-	ctx->hardlink = FALSE; //FIXME:broken! getenv("MAILDIR_COPY_WITH_HARDLINKS") != NULL;
+	ctx->hardlink = getenv("MAILDIR_COPY_WITH_HARDLINKS") != NULL;
 	ctx->mbox = mbox;
 	return ctx;
 }
 
 int maildir_transaction_copy_commit(struct maildir_copy_context *ctx)
 {
+	if (ctx->keywords_sync_ctx != NULL) {
+		maildir_keywords_sync_deinit(ctx->keywords_sync_ctx);
+		maildir_uidlist_sync_deinit(ctx->uidlist_sync_ctx);
+	}
 	pool_unref(ctx->pool);
 	return 0;
 }
@@ -125,8 +162,8 @@
 
 	for (rb = ctx->rollbacks; rb != NULL; rb = rb->next) {
 		t_push();
-		(void)unlink(t_strconcat(ctx->mbox->path,
-					 "/new/", rb->fname, NULL));
+		(void)unlink(t_strconcat(ctx->mbox->path, "/",
+					 rb->fname, NULL));
 		t_pop();
 	}
 

Index: maildir-save.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-save.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- maildir-save.c	30 Dec 2005 18:52:58 -0000	1.61
+++ maildir-save.c	30 Dec 2005 19:12:46 -0000	1.62
@@ -321,8 +321,9 @@
 
 	buffer_update_const_data(ctx->keywords_buffer, mf + 1,
 				 mf->keywords_count * sizeof(unsigned int));
-	return maildir_filename_set_flags(ctx->sync_ctx, mf->basename,
-					  mf->flags, &ctx->keywords_array);
+	return maildir_filename_set_flags(
+			maildir_sync_get_keywords_sync_ctx(ctx->sync_ctx),
+			mf->basename, mf->flags, &ctx->keywords_array);
 }
 
 static void

Index: maildir-storage.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.h,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -d -r1.42 -r1.43
--- maildir-storage.h	7 Oct 2005 09:34:12 -0000	1.42
+++ maildir-storage.h	30 Dec 2005 19:12:46 -0000	1.43
@@ -41,6 +41,7 @@
 struct timeval;
 struct maildir_save_context;
 struct maildir_copy_context;
+struct maildir_keywords_sync_ctx;
 
 struct maildir_storage {
 	struct index_storage storage;
@@ -135,11 +136,12 @@
 
 int maildir_sync_last_commit(struct maildir_mailbox *mbox);
 
-int maildir_filename_get_flags(struct maildir_index_sync_context *ctx,
-			       const char *fname,
-			       enum mail_flags *flags_r,
+int maildir_filename_get_flags(struct maildir_keywords_sync_ctx *ctx,
+			       const char *fname, enum mail_flags *flags_r,
 			       array_t *keywords);
-const char *maildir_filename_set_flags(struct maildir_index_sync_context *ctx,
+struct maildir_keywords_sync_ctx *
+maildir_sync_get_keywords_sync_ctx(struct maildir_index_sync_context *ctx);
+const char *maildir_filename_set_flags(struct maildir_keywords_sync_ctx *ctx,
 				       const char *fname, enum mail_flags flags,
 				       array_t *keywords);
 

Index: maildir-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -d -r1.67 -r1.68
--- maildir-sync.c	18 Sep 2005 15:41:38 -0000	1.67
+++ maildir-sync.c	30 Dec 2005 19:12:46 -0000	1.68
@@ -219,9 +219,14 @@
 	int dirty_state;
 };
 
-int maildir_filename_get_flags(struct maildir_index_sync_context *ctx,
-			       const char *fname,
-			       enum mail_flags *flags_r,
+struct maildir_keywords_sync_ctx *
+maildir_sync_get_keywords_sync_ctx(struct maildir_index_sync_context *ctx)
+{
+	return ctx->keywords_sync_ctx;
+}
+
+int maildir_filename_get_flags(struct maildir_keywords_sync_ctx *ctx,
+			       const char *fname, enum mail_flags *flags_r,
                                array_t *keywords_r)
 {
 	ARRAY_SET_TYPE(keywords_r, unsigned int);
@@ -256,8 +261,7 @@
 			    *info <= MAILDIR_KEYWORD_LAST) {
 				int idx;
 
-				idx = maildir_keywords_char_idx(
-						ctx->keywords_sync_ctx, *info);
+				idx = maildir_keywords_char_idx(ctx, *info);
 				if (idx < 0) {
 					/* unknown keyword. */
 					break;
@@ -293,7 +297,7 @@
 	}
 }
 
-const char *maildir_filename_set_flags(struct maildir_index_sync_context *ctx,
+const char *maildir_filename_set_flags(struct maildir_keywords_sync_ctx *ctx,
 				       const char *fname, enum mail_flags flags,
 				       array_t *keywords)
 {
@@ -355,8 +359,8 @@
 
 		if (keywords != NULL && array_is_created(keywords) &&
 		    nextflag > MAILDIR_KEYWORD_FIRST) {
-			maildir_filename_append_keywords(ctx->keywords_sync_ctx,
-							 keywords, flags_str);
+			maildir_filename_append_keywords(ctx, keywords,
+							 flags_str);
 			keywords = NULL;
 		}
 
@@ -405,7 +409,8 @@
 	ctx->dirty_state = 0;
 
 	ARRAY_CREATE(&keywords, pool_datastack_create(), unsigned int, 16);
-	(void)maildir_filename_get_flags(ctx, path, &flags, &keywords);
+	(void)maildir_filename_get_flags(ctx->keywords_sync_ctx,
+					 path, &flags, &keywords);
 	flags8 = flags;
 
 	recs = array_get_modifyable(&ctx->sync_recs, &count);
@@ -429,7 +434,8 @@
 		}
 	}
 
-	newpath = maildir_filename_set_flags(ctx, path, flags8, &keywords);
+	newpath = maildir_filename_set_flags(ctx->keywords_sync_ctx,
+					     path, flags8, &keywords);
 	if (rename(path, newpath) == 0) {
 		if ((flags8 & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
 			ctx->dirty_state = -1;
@@ -884,8 +890,8 @@
 		     unsigned int, MAILDIR_MAX_KEYWORDS);
 	iter = maildir_uidlist_iter_init(mbox->uidlist);
 	while (maildir_uidlist_iter_next(iter, &uid, &uflags, &filename)) {
-		maildir_filename_get_flags(sync_ctx, filename,
-					   &flags, &keywords);
+		maildir_filename_get_flags(sync_ctx->keywords_sync_ctx,
+					   filename, &flags, &keywords);
 
 		if ((uflags & MAILDIR_UIDLIST_REC_FLAG_RECENT) != 0 &&
 		    (uflags & MAILDIR_UIDLIST_REC_FLAG_NEW_DIR) != 0 &&



More information about the dovecot-cvs mailing list