dovecot-2.2: lib-storage: Added mailbox_list_index_delete_entry()
dovecot at dovecot.org
dovecot at dovecot.org
Tue Oct 21 01:00:11 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/c92472804eb8
changeset: 17974:c92472804eb8
user: Timo Sirainen <tss at iki.fi>
date: Tue Oct 21 03:58:56 2014 +0300
description:
lib-storage: Added mailbox_list_index_delete_entry()
diffstat:
src/lib-storage/list/mailbox-list-index-backend.c | 69 +---------------------
src/lib-storage/list/mailbox-list-index-sync.c | 55 ++++++++++++++++++
src/lib-storage/list/mailbox-list-index-sync.h | 3 +
3 files changed, 63 insertions(+), 64 deletions(-)
diffs (187 lines):
diff -r a9503b723f8c -r c92472804eb8 src/lib-storage/list/mailbox-list-index-backend.c
--- a/src/lib-storage/list/mailbox-list-index-backend.c Tue Oct 21 02:48:20 2014 +0300
+++ b/src/lib-storage/list/mailbox-list-index-backend.c Tue Oct 21 03:58:56 2014 +0300
@@ -413,10 +413,9 @@
}
static void
-index_list_try_delete(struct index_mailbox_list *list, const char *name,
+index_list_try_delete(struct mailbox_list *_list, const char *name,
enum mailbox_list_path_type type)
{
- struct mailbox_list *_list = &list->list;
const char *mailbox_path, *path;
if (mailbox_list_get_path(_list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX,
@@ -446,7 +445,7 @@
}
static void
-index_list_delete_finish(struct index_mailbox_list *list, const char *name)
+index_list_delete_finish(struct mailbox_list *list, const char *name)
{
index_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_INDEX);
index_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_CONTROL);
@@ -454,65 +453,8 @@
}
static int
-index_list_delete_entry(struct index_mailbox_list *list, const char *name,
- bool delete_selectable)
-{
- struct mailbox_list_index_sync_context *sync_ctx;
- struct mailbox_list_index_record rec;
- struct mailbox_list_index_node *node;
- const void *data;
- bool expunged;
- uint32_t seq;
-
- if (mailbox_list_index_sync_begin(&list->list, &sync_ctx) < 0)
- return -1;
-
- node = mailbox_list_index_lookup(&list->list, name);
- if (node == NULL) {
- (void)mailbox_list_index_sync_end(&sync_ctx, FALSE);
- mailbox_list_set_error(&list->list, MAIL_ERROR_NOTFOUND,
- T_MAIL_ERR_MAILBOX_NOT_FOUND(name));
- return -1;
- }
- if (!mail_index_lookup_seq(sync_ctx->view, node->uid, &seq))
- i_panic("mailbox list index: lost uid=%u", node->uid);
- if (delete_selectable) {
- /* make it at least non-selectable */
- node->flags = MAILBOX_LIST_INDEX_FLAG_NOSELECT;
- mail_index_update_flags(sync_ctx->trans, seq, MODIFY_REPLACE,
- (enum mail_flags)node->flags);
-
- mail_index_lookup_ext(sync_ctx->view, seq,
- sync_ctx->ilist->ext_id,
- &data, &expunged);
- i_assert(data != NULL && !expunged);
- memcpy(&rec, data, sizeof(rec));
- rec.uid_validity = 0;
- memset(&rec.guid, 0, sizeof(rec.guid));
- mail_index_update_ext(sync_ctx->trans, seq,
- sync_ctx->ilist->ext_id, &rec, NULL);
- }
- if (node->children != NULL) {
- /* can't delete this directory before its children,
- but we may have made it non-selectable already */
- if (mailbox_list_index_sync_end(&sync_ctx, TRUE) < 0)
- return -1;
- return 0;
- }
-
- /* we can remove the entire node */
- mail_index_expunge(sync_ctx->trans, seq);
- mailbox_list_index_node_unlink(sync_ctx->ilist, node);
-
- if (mailbox_list_index_sync_end(&sync_ctx, TRUE) < 0)
- return -1;
- return 1;
-}
-
-static int
index_list_delete_mailbox(struct mailbox_list *_list, const char *name)
{
- struct index_mailbox_list *list = (struct index_mailbox_list *)_list;
const char *path;
int ret;
@@ -532,9 +474,9 @@
}
if (ret == 0 || (_list->props & MAILBOX_LIST_PROP_AUTOCREATE_DIRS) != 0)
- index_list_delete_finish(list, name);
+ index_list_delete_finish(_list, name);
if (ret == 0) {
- if (index_list_delete_entry(list, name, TRUE) < 0)
+ if (mailbox_list_index_delete_entry(_list, name, TRUE) < 0)
return -1;
}
return ret;
@@ -543,10 +485,9 @@
static int
index_list_delete_dir(struct mailbox_list *_list, const char *name)
{
- struct index_mailbox_list *list = (struct index_mailbox_list *)_list;
int ret;
- if ((ret = index_list_delete_entry(list, name, FALSE)) < 0)
+ if ((ret = mailbox_list_index_delete_entry(_list, name, FALSE)) < 0)
return -1;
if (ret == 0) {
mailbox_list_set_error(_list, MAIL_ERROR_EXISTS,
diff -r a9503b723f8c -r c92472804eb8 src/lib-storage/list/mailbox-list-index-sync.c
--- a/src/lib-storage/list/mailbox-list-index-sync.c Tue Oct 21 02:48:20 2014 +0300
+++ b/src/lib-storage/list/mailbox-list-index-sync.c Tue Oct 21 03:58:56 2014 +0300
@@ -394,3 +394,58 @@
ret = mailbox_list_index_sync_list(sync_ctx);
return mailbox_list_index_sync_end(&sync_ctx, ret == 0);
}
+
+int mailbox_list_index_delete_entry(struct mailbox_list *list, const char *name,
+ bool delete_selectable)
+{
+ struct mailbox_list_index_sync_context *sync_ctx;
+ struct mailbox_list_index_record rec;
+ struct mailbox_list_index_node *node;
+ const void *data;
+ bool expunged;
+ uint32_t seq;
+
+ if (mailbox_list_index_sync_begin(list, &sync_ctx) < 0)
+ return -1;
+
+ node = mailbox_list_index_lookup(list, name);
+ if (node == NULL) {
+ (void)mailbox_list_index_sync_end(&sync_ctx, FALSE);
+ mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
+ T_MAIL_ERR_MAILBOX_NOT_FOUND(name));
+ return -1;
+ }
+ if (!mail_index_lookup_seq(sync_ctx->view, node->uid, &seq))
+ i_panic("mailbox list index: lost uid=%u", node->uid);
+ if (delete_selectable) {
+ /* make it at least non-selectable */
+ node->flags = MAILBOX_LIST_INDEX_FLAG_NOSELECT;
+ mail_index_update_flags(sync_ctx->trans, seq, MODIFY_REPLACE,
+ (enum mail_flags)node->flags);
+
+ mail_index_lookup_ext(sync_ctx->view, seq,
+ sync_ctx->ilist->ext_id,
+ &data, &expunged);
+ i_assert(data != NULL && !expunged);
+ memcpy(&rec, data, sizeof(rec));
+ rec.uid_validity = 0;
+ memset(&rec.guid, 0, sizeof(rec.guid));
+ mail_index_update_ext(sync_ctx->trans, seq,
+ sync_ctx->ilist->ext_id, &rec, NULL);
+ }
+ if (node->children != NULL) {
+ /* can't delete this directory before its children,
+ but we may have made it non-selectable already */
+ if (mailbox_list_index_sync_end(&sync_ctx, TRUE) < 0)
+ return -1;
+ return 0;
+ }
+
+ /* we can remove the entire node */
+ mail_index_expunge(sync_ctx->trans, seq);
+ mailbox_list_index_node_unlink(sync_ctx->ilist, node);
+
+ if (mailbox_list_index_sync_end(&sync_ctx, TRUE) < 0)
+ return -1;
+ return 1;
+}
diff -r a9503b723f8c -r c92472804eb8 src/lib-storage/list/mailbox-list-index-sync.h
--- a/src/lib-storage/list/mailbox-list-index-sync.h Tue Oct 21 02:48:20 2014 +0300
+++ b/src/lib-storage/list/mailbox-list-index-sync.h Tue Oct 21 03:58:56 2014 +0300
@@ -29,4 +29,7 @@
struct mailbox_list_index_node **node_r,
bool *created_r);
+int mailbox_list_index_delete_entry(struct mailbox_list *list, const char *name,
+ bool delete_selectable);
+
#endif
More information about the dovecot-cvs
mailing list