Mercurial > dovecot > core-2.2
changeset 10371:b99a19d5a93c HEAD
dsync: Sync mailbox renames.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Nov 2009 14:19:39 -0500 |
parents | ce18bbd3e964 |
children | 0b101a864534 |
files | src/dsync/dsync-brain-private.h src/dsync/dsync-brain.c |
diffstat | 2 files changed, 34 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/dsync/dsync-brain-private.h Wed Nov 18 23:13:08 2009 -0500 +++ b/src/dsync/dsync-brain-private.h Thu Nov 19 14:19:39 2009 -0500 @@ -12,7 +12,7 @@ DSYNC_STATE_SYNC_MSGS, DSYNC_STATE_SYNC_MSGS_FLUSH, DSYNC_STATE_SYNC_MSGS_FLUSH2, - DSYNC_STATE_SYNC_UPDATE_MAILBOX, + DSYNC_STATE_SYNC_UPDATE_MAILBOXES, DSYNC_STATE_SYNC_FLUSH, DSYNC_STATE_SYNC_FLUSH2, DSYNC_STATE_SYNC_END
--- a/src/dsync/dsync-brain.c Wed Nov 18 23:13:08 2009 -0500 +++ b/src/dsync/dsync-brain.c Thu Nov 19 14:19:39 2009 -0500 @@ -416,6 +416,15 @@ return FALSE; } +static bool dsync_mailbox_has_changes(struct dsync_brain *brain, + const struct dsync_mailbox *box1, + const struct dsync_mailbox *box2) +{ + if (strcmp(box1->name, box2->name) != 0) + return TRUE; + return dsync_mailbox_has_changed_msgs(brain, box1, box2); +} + static void dsync_brain_get_changed_mailboxes(struct dsync_brain *brain, ARRAY_TYPE(dsync_brain_mailbox) *brain_boxes, @@ -439,9 +448,8 @@ ret = dsync_mailbox_guid_cmp(src_boxes[src], dest_boxes[dest]); if (ret == 0) { if ((full_sync || - dsync_mailbox_has_changed_msgs(brain, - src_boxes[src], - dest_boxes[dest])) && + dsync_mailbox_has_changes(brain, src_boxes[src], + dest_boxes[dest])) && !src_deleted && !dest_deleted) { brain_box = array_append_space(brain_boxes); brain_box->box = *src_boxes[src]; @@ -521,11 +529,30 @@ } static void -dsync_brain_msg_sync_update_mailbox(struct dsync_brain *brain) +dsync_brain_sync_rename_mailbox(struct dsync_brain *brain, + const struct dsync_brain_mailbox *mailbox) +{ + if (mailbox->src->last_renamed > mailbox->dest->last_renamed) { + dsync_worker_rename_mailbox(brain->dest_worker, + &mailbox->box.mailbox_guid, + mailbox->src->name); + } else { + dsync_worker_rename_mailbox(brain->src_worker, + &mailbox->box.mailbox_guid, + mailbox->dest->name); + } +} + +static void +dsync_brain_sync_update_mailboxes(struct dsync_brain *brain) { const struct dsync_brain_mailbox *mailbox; array_foreach(&brain->mailbox_sync->mailboxes, mailbox) { + if (mailbox->src != NULL && mailbox->dest != NULL && + strcmp(mailbox->src->name, mailbox->dest->name) != 0) + dsync_brain_sync_rename_mailbox(brain, mailbox); + dsync_worker_update_mailbox(brain->src_worker, &mailbox->box); dsync_worker_update_mailbox(brain->dest_worker, &mailbox->box); } @@ -584,8 +611,8 @@ break; case DSYNC_STATE_SYNC_MSGS_FLUSH2: break; - case DSYNC_STATE_SYNC_UPDATE_MAILBOX: - dsync_brain_msg_sync_update_mailbox(brain); + case DSYNC_STATE_SYNC_UPDATE_MAILBOXES: + dsync_brain_sync_update_mailboxes(brain); brain->state++; /* fall through */ case DSYNC_STATE_SYNC_FLUSH: