changeset 14184:c581f6c1eef9

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.
author Timo Sirainen <tss@iki.fi>
date Fri, 17 Feb 2012 00:34:24 +0200
parents aa25bb2384ce
children 119195278272
files src/doveadm/dsync/dsync-brain-msgs-new.c src/doveadm/dsync/dsync-brain-msgs.c src/doveadm/dsync/dsync-brain-private.h
diffstat 3 files changed, 17 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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) {
--- 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