dovecot-2.1: dsync: If message with same GUID is saved multiple ...

dovecot at dovecot.org dovecot at dovecot.org
Fri Feb 17 00:34:32 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/c581f6c1eef9
changeset: 14165:c581f6c1eef9
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Feb 17 00:34:24 2012 +0200
description:
dsync: If message with same GUID is saved multiple times in session, copy it instead of re-saving.
This only works if the messages are in different mailboxes. It would be
possible to fix it also for copying within same mailbox, but that's probably
rare enough that it's not worth the extra code.

diffstat:

 src/doveadm/dsync/dsync-brain-msgs-new.c |   1 +
 src/doveadm/dsync/dsync-brain-msgs.c     |  20 ++++++++++++--------
 src/doveadm/dsync/dsync-brain-private.h  |   4 ++++
 3 files changed, 17 insertions(+), 8 deletions(-)

diffs (69 lines):

diff -r aa25bb2384ce -r c581f6c1eef9 src/doveadm/dsync/dsync-brain-msgs-new.c
--- a/src/doveadm/dsync/dsync-brain-msgs-new.c	Fri Feb 17 00:32:06 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-msgs-new.c	Fri Feb 17 00:34:24 2012 +0200
@@ -52,6 +52,7 @@
 {
 	struct dsync_brain_msg_save_context *ctx = context;
 
+	dsync_brain_guid_add(ctx->iter, ctx->mailbox_idx, ctx->msg);
 	if (--ctx->iter->save_results_left == 0 && !ctx->iter->adding_msgs)
 		dsync_brain_msg_sync_add_new_msgs(ctx->iter);
 	i_free(ctx);
diff -r aa25bb2384ce -r c581f6c1eef9 src/doveadm/dsync/dsync-brain-msgs.c
--- a/src/doveadm/dsync/dsync-brain-msgs.c	Fri Feb 17 00:32:06 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-msgs.c	Fri Feb 17 00:34:24 2012 +0200
@@ -50,21 +50,23 @@
 #include "dsync-worker.h"
 #include "dsync-brain-private.h"
 
-static void dsync_brain_guid_add(struct dsync_brain_msg_iter *iter)
+void dsync_brain_guid_add(struct dsync_brain_msg_iter *iter,
+			  unsigned int mailbox_idx,
+			  const struct dsync_message *msg)
 {
 	struct dsync_brain_guid_instance *inst, *prev_inst;
 
-	if ((iter->msg.flags & DSYNC_MAIL_FLAG_EXPUNGED) != 0)
+	if ((msg->flags & DSYNC_MAIL_FLAG_EXPUNGED) != 0)
 		return;
 
 	inst = p_new(iter->sync->pool, struct dsync_brain_guid_instance, 1);
-	inst->mailbox_idx = iter->mailbox_idx;
-	inst->uid = iter->msg.uid;
+	inst->mailbox_idx = mailbox_idx;
+	inst->uid = msg->uid;
 
-	prev_inst = hash_table_lookup(iter->guid_hash, iter->msg.guid);
+	prev_inst = hash_table_lookup(iter->guid_hash, msg->guid);
 	if (prev_inst == NULL) {
 		hash_table_insert(iter->guid_hash,
-				  p_strdup(iter->sync->pool, iter->msg.guid),
+				  p_strdup(iter->sync->pool, msg->guid),
 				  inst);
 	} else {
 		inst->next = prev_inst->next;
@@ -80,8 +82,10 @@
 		ret = dsync_worker_msg_iter_next(iter->iter,
 						 &iter->mailbox_idx,
 						 &iter->msg);
-		if (ret > 0)
-			dsync_brain_guid_add(iter);
+		if (ret > 0) {
+			dsync_brain_guid_add(iter, iter->mailbox_idx,
+					     &iter->msg);
+		}
 	}
 
 	if (iter->sync->wanted_mailbox_idx != iter->mailbox_idx) {
diff -r aa25bb2384ce -r c581f6c1eef9 src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Fri Feb 17 00:32:06 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-private.h	Fri Feb 17 00:34:24 2012 +0200
@@ -141,4 +141,8 @@
 
 void dsync_brain_msg_sync_new_msgs(struct dsync_brain_mailbox_sync *sync);
 
+void dsync_brain_guid_add(struct dsync_brain_msg_iter *iter,
+			  unsigned int mailbox_idx,
+			  const struct dsync_message *msg);
+
 #endif


More information about the dovecot-cvs mailing list