1
/* Copyright (c) 2010-2011 Dovecot authors, see the included COPYING file */
1
/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
5
5
#include "mail-index.h"
6
6
#include "mail-storage.h"
7
7
#include "mail-namespace.h"
8
#include "doveadm-mail-list-iter.h"
8
#include "doveadm-mailbox-list-iter.h"
9
9
#include "doveadm-mail-iter.h"
10
10
#include "doveadm-mail.h"
18
cmd_altmove_box(const struct mailbox_info *info,
18
cmd_altmove_box(struct doveadm_mail_cmd_context *ctx,
19
const struct mailbox_info *info,
19
20
struct mail_search_args *search_args, bool reverse)
21
22
struct doveadm_mail_iter *iter;
24
25
enum modify_type modify_type =
25
26
!reverse ? MODIFY_ADD : MODIFY_REMOVE;
27
if (doveadm_mail_iter_init(info, search_args, &trans, &iter) < 0)
28
if (doveadm_mail_iter_init(ctx, info, search_args, 0, NULL,
30
mail = mail_alloc(trans, 0, NULL);
31
while (doveadm_mail_iter_next(iter, mail)) {
32
while (doveadm_mail_iter_next(iter, &mail)) {
32
33
if (doveadm_debug) {
33
34
i_debug("altmove: box=%s uid=%u",
34
35
info->name, mail->uid);
36
37
mail_update_flags(mail, modify_type,
37
38
(enum mail_flags)MAIL_INDEX_MAIL_FLAG_BACKEND);
40
40
return doveadm_mail_iter_deinit_sync(&iter);
43
static void ns_purge(struct mail_namespace *ns)
44
ns_purge(struct doveadm_mail_cmd_context *ctx, struct mail_namespace *ns)
45
46
if (mail_storage_purge(ns->storage) < 0) {
46
47
i_error("Purging namespace '%s' failed: %s", ns->prefix,
47
48
mail_storage_get_last_error(ns->storage, NULL));
49
doveadm_mail_failed_storage(ctx, ns->storage);
52
56
cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
54
58
struct altmove_cmd_context *ctx = (struct altmove_cmd_context *)_ctx;
55
59
const enum mailbox_list_iter_flags iter_flags =
56
60
MAILBOX_LIST_ITER_RAW_LIST |
57
MAILBOX_LIST_ITER_NO_AUTO_INBOX |
61
MAILBOX_LIST_ITER_NO_AUTO_BOXES |
58
62
MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
59
struct doveadm_mail_list_iter *iter;
63
struct doveadm_mailbox_list_iter *iter;
60
64
const struct mailbox_info *info;
61
65
struct mail_namespace *ns, *prev_ns = NULL;
62
66
ARRAY_DEFINE(purged_storages, struct mail_storage *);
63
67
struct mail_storage *const *storages;
64
68
unsigned int i, count;
66
71
t_array_init(&purged_storages, 8);
67
iter = doveadm_mail_list_iter_init(user, _ctx->search_args, iter_flags);
68
while ((info = doveadm_mail_list_iter_next(iter)) != NULL) T_BEGIN {
72
iter = doveadm_mailbox_list_iter_init(_ctx, user, _ctx->search_args,
74
while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) T_BEGIN {
69
75
if (info->ns != prev_ns) {
70
76
if (prev_ns != NULL) {
77
if (ns_purge(_ctx, prev_ns) < 0)
72
79
array_append(&purged_storages,
73
80
&prev_ns->storage, 1);
75
82
prev_ns = info->ns;
77
(void)cmd_altmove_box(info, _ctx->search_args, ctx->reverse);
84
if (cmd_altmove_box(_ctx, info, _ctx->search_args, ctx->reverse) < 0)
79
doveadm_mail_list_iter_deinit(&iter);
87
if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
81
90
/* make sure all private storages have been purged */
82
91
storages = array_get(&purged_storages, &count);