dsync-brain-mailbox-tree-sync.c revision e83126866761632b437e532dfdc30be01d14039d
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen/* Copyright (c) 2012 Dovecot authors, see the included COPYING file */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainensync_create_box(struct mailbox *box, const guid_128_t mailbox_guid,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen memcpy(update.mailbox_guid, mailbox_guid, sizeof(update.mailbox_guid));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (mailbox_create(box, &update, FALSE) < 0) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen /* sync the mailbox so we can look up its latest status */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen /* verify that the GUID is what we wanted. if it's not, it probably
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen means that the mailbox had already been created. then we'll use the
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen GUID that is higher.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen mismatching UIDVALIDITY is handled later, because we choose it by
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen checking which mailbox has more messages */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (mailbox_get_metadata(box, MAILBOX_METADATA_GUID, &metadata) < 0) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (memcmp(mailbox_guid, metadata.guid, sizeof(metadata.guid)) > 0) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenint dsync_brain_mailbox_tree_sync_change(struct dsync_brain *brain,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen const struct dsync_mailbox_tree_sync_change *change)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen const char *errstr, *func_name = NULL, *storage_name;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen /* make sure we're deleting the correct mailbox */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = dsync_brain_mailbox_alloc(brain, change->mailbox_guid,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen storage_name = mailbox_list_get_storage_name(change->ns->list,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (mailbox_list_delete_dir(change->ns->list, storage_name) == 0)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen errstr = mailbox_list_get_last_error(change->ns->list, &error);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen i_error("Mailbox sync: mailbox_list_delete_dir failed: %s",
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen box = mailbox_alloc(change->ns->list, change->full_name, 0);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sync_create_box(box, change->mailbox_guid,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen case DSYNC_MAILBOX_TREE_SYNC_TYPE_UNSUBSCRIBE:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen /* mailbox was already created or was already deleted.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen let the next sync figure out what to do */