struct mail_index_sync_ctx *ctx = *_ctx;
struct mail_index *index = ctx->index;
uint32_t next_uid;
- bool want_rotate, index_undeleted;
+ bool want_rotate, index_undeleted, delete_index;
int ret = 0;
index_undeleted = ctx->ext_trans->index_undeleted;
- if (index->index_delete_requested && !index_undeleted) {
+ delete_index = index->index_delete_requested && !index_undeleted &&
+ (ctx->flags & MAIL_INDEX_SYNC_FLAG_DELETING_INDEX) != 0;
+ if (delete_index) {
/* finish this sync by marking the index deleted */
mail_index_set_deleted(ctx->ext_trans);
}
return -1;
}
- if (index_undeleted) {
+ if (delete_index)
+ index->index_deleted = TRUE;
+ else if (index_undeleted) {
index->index_deleted = FALSE;
index->index_delete_requested = FALSE;
}
- if (index->index_delete_requested)
- index->index_deleted = TRUE;
/* refresh the mapping with newly committed external transactions
and the synced expunges. sync using file handler here so that the
return 0 in mail_index_sync_begin() */
MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES = 0x08,
/* Create the transaction with FSYNC flag */
- MAIL_INDEX_SYNC_FLAG_FSYNC = 0x10
+ MAIL_INDEX_SYNC_FLAG_FSYNC = 0x10,
+ /* If we see "delete index" request transaction, finish it */
+ MAIL_INDEX_SYNC_FLAG_DELETING_INDEX = 0x20
};
enum mail_index_view_sync_flags {
ctx = i_new(struct cydir_sync_context, 1);
ctx->mbox = mbox;
- sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY;
- if ((mbox->box.flags & MAILBOX_FLAG_KEEP_RECENT) == 0)
- sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+ sync_flags = index_storage_get_sync_flags(&mbox->box) |
+ MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY;
if (!force)
sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
{
struct mail_storage *storage = mbox->box.storage;
struct mdbox_sync_context *ctx;
- enum mail_index_sync_flags sync_flags = 0;
+ enum mail_index_sync_flags sync_flags;
unsigned int i;
int ret;
bool rebuild, storage_rebuilt = FALSE;
ctx->mbox = mbox;
ctx->flags = flags;
- if ((mbox->box.flags & MAILBOX_FLAG_KEEP_RECENT) == 0)
- sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+ sync_flags = index_storage_get_sync_flags(&mbox->box);
if (!rebuild && (flags & MDBOX_SYNC_FLAG_FORCE) == 0)
sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
if ((flags & MDBOX_SYNC_FLAG_FSYNC) != 0)
{
struct mail_storage *storage = mbox->box.storage;
struct sdbox_sync_context *ctx;
- enum mail_index_sync_flags sync_flags = 0;
+ enum mail_index_sync_flags sync_flags;
unsigned int i;
int ret;
bool rebuild;
ctx->mbox = mbox;
ctx->flags = flags;
- if ((mbox->box.flags & MAILBOX_FLAG_KEEP_RECENT) == 0)
- sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+ sync_flags = index_storage_get_sync_flags(&mbox->box);
if (!rebuild && (flags & SDBOX_SYNC_FLAG_FORCE) == 0)
sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
if ((flags & SDBOX_SYNC_FLAG_FSYNC) != 0)
void index_mailbox_check_add(struct mailbox *box, const char *path);
void index_mailbox_check_remove_all(struct mailbox *box);
+enum mail_index_sync_flags index_storage_get_sync_flags(struct mailbox *box);
bool index_mailbox_want_full_sync(struct mailbox *box,
enum mailbox_sync_flags flags);
struct mailbox_sync_context *
#include "array.h"
#include "index-sync-private.h"
+enum mail_index_sync_flags index_storage_get_sync_flags(struct mailbox *box)
+{
+ enum mail_index_sync_flags sync_flags = 0;
+
+ if ((box->flags & MAILBOX_FLAG_KEEP_RECENT) == 0)
+ sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+ if (box->deleting)
+ sync_flags |= MAIL_INDEX_SYNC_FLAG_DELETING_INDEX;
+ return sync_flags;
+}
+
bool index_mailbox_want_full_sync(struct mailbox *box,
enum mailbox_sync_flags flags)
{
struct mail_index_transaction *trans;
enum mail_index_sync_flags sync_flags;
- sync_flags = 0;
+ sync_flags = index_storage_get_sync_flags(&mbox->box);
/* don't drop recent messages if we're saving messages */
- if ((_box->flags & MAILBOX_FLAG_KEEP_RECENT) == 0 &&
- maildir_sync_ctx != NULL)
- sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+ if (maildir_sync_ctx == NULL)
+ sync_flags &= ~MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
if (mail_index_sync_begin(_box->index, &sync_ctx, &view,
&trans, sync_flags) < 0) {
}
}
- sync_flags = 0;
- if ((mbox->box.flags & MAILBOX_FLAG_KEEP_RECENT) == 0)
- sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+ sync_flags = index_storage_get_sync_flags(&mbox->box);
if ((flags & MBOX_SYNC_REWRITE) != 0)
sync_flags |= MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY;
i_assert(!mbox->synced);
- sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY |
+ sync_flags = index_storage_get_sync_flags(&mbox->box) |
+ MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY |
MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
- if ((mbox->box.flags & MAILBOX_FLAG_KEEP_RECENT) == 0)
- sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
ret = mail_index_sync_begin(mbox->box.index, &index_sync_ctx,
&sync_view, &trans, sync_flags);
unsigned int mailbox_deleted:1;
/* we've discovered there aren't enough permissions to modify mailbox */
unsigned int backend_readonly:1;
+ /* Mailbox is being deleted */
+ unsigned int deleting:1;
};
struct mail_vfuncs {
return -1;
}
+ box->deleting = TRUE;
if (mailbox_open(box) < 0) {
(void)mail_storage_get_last_error(box->storage, &error);
if (error != MAIL_ERROR_NOTFOUND)
return -1;
}
ret = box->v.delete(box);
+
+ box->deleting = FALSE;
mailbox_close(box);
return ret;
}