# HG changeset patch # User Timo Sirainen # Date 1304162430 -10800 # Node ID efc0eea75258f2a27836ca9582edcc8aa7a901e2 # Parent 0be58f3930b205abb2c6b376b3fffc4da78d8b83 lazy-expunge: Removed support for more than one lazy-expunge namespace. More than one is conceptually difficult to understand, complicates the code and after the next change it wouldn't even work anymore. diff -r 0be58f3930b2 -r efc0eea75258 src/plugins/lazy-expunge/lazy-expunge-plugin.c --- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c Sat Apr 30 13:41:18 2011 +0300 +++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c Sat Apr 30 14:20:30 2011 +0300 @@ -27,18 +27,10 @@ #define LAZY_EXPUNGE_MAIL_CONTEXT(obj) \ MODULE_CONTEXT(obj, lazy_expunge_mail_module) -enum lazy_namespace { - LAZY_NAMESPACE_EXPUNGE, - LAZY_NAMESPACE_DELETE, - LAZY_NAMESPACE_DELETE_EXPUNGE, - - LAZY_NAMESPACE_COUNT -}; - struct lazy_expunge_mail_user { union mail_user_module_context module_ctx; - struct mail_namespace *lazy_ns[LAZY_NAMESPACE_COUNT]; + struct mail_namespace *lazy_ns; const char *env; }; @@ -99,28 +91,20 @@ return box; } -static struct mail_namespace * -get_lazy_ns(struct mail_user *user, enum lazy_namespace type) -{ - struct lazy_expunge_mail_user *luser = LAZY_EXPUNGE_USER_CONTEXT(user); - - return luser->lazy_ns[type]; -} - static void lazy_expunge_mail_expunge(struct mail *_mail) { struct mail_namespace *ns = _mail->box->list->ns; + struct lazy_expunge_mail_user *luser = + LAZY_EXPUNGE_USER_CONTEXT(ns->user); struct mail_private *mail = (struct mail_private *)_mail; union mail_module_context *mmail = LAZY_EXPUNGE_MAIL_CONTEXT(mail); struct lazy_expunge_transaction *lt = LAZY_EXPUNGE_CONTEXT(_mail->transaction); - struct mail_namespace *dest_ns; struct mail_save_context *save_ctx; const char *error; - dest_ns = get_lazy_ns(ns->user, LAZY_NAMESPACE_EXPUNGE); if (lt->dest_box == NULL) { - lt->dest_box = mailbox_open_or_create(dest_ns->list, + lt->dest_box = mailbox_open_or_create(luser->lazy_ns->list, _mail->box->name, &error); if (lt->dest_box == NULL) { mail_storage_set_critical(_mail->box->storage, @@ -354,16 +338,14 @@ static int lazy_expunge_mailbox_delete(struct mailbox *box) { + struct lazy_expunge_mail_user *luser = + LAZY_EXPUNGE_USER_CONTEXT(box->storage->user); union mailbox_module_context *lbox = LAZY_EXPUNGE_CONTEXT(box); struct lazy_expunge_mailbox_list *llist = LAZY_EXPUNGE_LIST_CONTEXT(box->list); - struct mailbox_list *list = box->list; - struct mail_namespace *expunge_ns, *dest_ns; struct mailbox *expunge_box; - const char *destname, *str; - struct tm *tm; - char timestamp[256]; + const char *str; int ret; if (llist->internal_namespace || !box->opened) { @@ -372,29 +354,12 @@ return lbox->super.delete(box); } - expunge_ns = get_lazy_ns(list->ns->user, LAZY_NAMESPACE_EXPUNGE); - dest_ns = get_lazy_ns(list->ns->user, LAZY_NAMESPACE_DELETE); - if (expunge_ns == dest_ns) { - /* if there are no expunged messages in this mailbox, - we can simply rename the mailbox to the destination name */ - destname = box->name; - } else { - /* destination mailbox name needs to contain a timestamp */ - tm = localtime(&ioloop_time); - if (strftime(timestamp, sizeof(timestamp), - "%Y%m%d-%H%M%S", tm) == 0) { - i_strocpy(timestamp, dec2str(ioloop_time), - sizeof(timestamp)); - } - destname = t_strconcat(box->name, "-", timestamp, NULL); - } - /* avoid potential race conditions by marking it deleted */ if (mailbox_mark_index_deleted(box, TRUE) < 0) return -1; /* rename it into the lazy_expunge namespace */ - ret = mailbox_move(box, dest_ns->list, destname, &expunge_box); + ret = mailbox_move(box, luser->lazy_ns->list, box->name, &expunge_box); if (ret < 0) return -1; if (ret == 0) { @@ -418,24 +383,9 @@ return -1; } - if (expunge_ns == dest_ns && strcmp(expunge_box->name, box->name) != 0) + if (strcmp(expunge_box->name, box->name) != 0) ret = mailbox_move_all_mails(expunge_box, box->name); - else - ret = 0; mailbox_free(&expunge_box); - - /* next move the expunged messages mailbox, if it exists */ - dest_ns = get_lazy_ns(list->ns->user, LAZY_NAMESPACE_DELETE_EXPUNGE); - if (expunge_ns != dest_ns) { - struct mailbox *ret_box; - - expunge_box = mailbox_alloc(expunge_ns->list, box->name, 0); - ret = mailbox_move(expunge_box, dest_ns->list, - destname, &ret_box); - if (ret > 0) - mailbox_free(&ret_box); - mailbox_free(&expunge_box); - } return ret < 0 ? -1 : 0; } @@ -490,23 +440,16 @@ struct lazy_expunge_mail_user *luser = LAZY_EXPUNGE_USER_CONTEXT(list->ns->user); struct lazy_expunge_mailbox_list *llist; - const char *const *p; - unsigned int i; if (luser == NULL) return; /* if this is one of our internal namespaces, mark it as such before quota plugin sees it */ - p = t_strsplit_spaces(luser->env, " "); - for (i = 0; i < LAZY_NAMESPACE_COUNT && *p != NULL; i++, p++) { - if (strcmp(list->ns->prefix, *p) == 0) { - list->ns->flags |= NAMESPACE_FLAG_NOQUOTA; - break; - } - } + if (strcmp(list->ns->prefix, luser->env) == 0) + list->ns->flags |= NAMESPACE_FLAG_NOQUOTA; - if (luser != NULL && list->ns->type == NAMESPACE_PRIVATE) { + if (list->ns->type == NAMESPACE_PRIVATE) { llist = p_new(list->pool, struct lazy_expunge_mailbox_list, 1); MODULE_CONTEXT_SET(list, lazy_expunge_mailbox_list_module, llist); @@ -519,45 +462,25 @@ struct lazy_expunge_mail_user *luser = LAZY_EXPUNGE_USER_CONTEXT(namespaces->user); struct lazy_expunge_mailbox_list *llist; - const char *const *p; - int i; if (luser == NULL) return; - p = t_strsplit_spaces(luser->env, " "); - for (i = 0; i < LAZY_NAMESPACE_COUNT && *p != NULL; i++, p++) { - const char *name = *p; - - luser->lazy_ns[i] = - mail_namespace_find_prefix(namespaces, name); - if (luser->lazy_ns[i] == NULL) - i_fatal("lazy_expunge: Unknown namespace: '%s'", name); - mail_namespace_ref(luser->lazy_ns[i]); + luser->lazy_ns = mail_namespace_find_prefix(namespaces, luser->env); + if (luser->lazy_ns == NULL) + i_fatal("lazy_expunge: Unknown namespace: '%s'", luser->env); + mail_namespace_ref(luser->lazy_ns); - /* we don't want to override these namespaces' expunge/delete - operations. */ - llist = LAZY_EXPUNGE_LIST_CONTEXT(luser->lazy_ns[i]->list); - llist->internal_namespace = TRUE; - } - if (i == 0) - i_fatal("lazy_expunge: No namespaces defined"); - for (; i < LAZY_NAMESPACE_COUNT; i++) { - luser->lazy_ns[i] = luser->lazy_ns[i-1]; - mail_namespace_ref(luser->lazy_ns[i]); - } + /* we don't want to override this namespace's expunge operation. */ + llist = LAZY_EXPUNGE_LIST_CONTEXT(luser->lazy_ns->list); + llist->internal_namespace = TRUE; } static void lazy_expunge_user_deinit(struct mail_user *user) { struct lazy_expunge_mail_user *luser = LAZY_EXPUNGE_USER_CONTEXT(user); - unsigned int i; - for (i = 0; i < LAZY_NAMESPACE_COUNT; i++) { - if (luser->lazy_ns[i] != NULL) - mail_namespace_unref(&luser->lazy_ns[i]); - } - + mail_namespace_unref(&luser->lazy_ns); luser->module_ctx.super.deinit(user); }