doveadm-mail-mailbox-status.c revision 1a40f0bdea5ec994d110d9780afbb6635651d85c
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen (MAILBOX_METADATA_VIRTUAL_SIZE | MAILBOX_METADATA_GUID)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen (STATUS_MESSAGES | STATUS_RECENT | STATUS_UNSEEN)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void status_parse_fields(struct status_cmd_context *ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *const *fields)
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen ctx->metadata_items |= MAILBOX_METADATA_VIRTUAL_SIZE;
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen ((ctx->status_items & ~TOTAL_STATUS_ITEMS) != 0 ||
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen (ctx->metadata_items & ~TOTAL_METADATA_ITEMS) != 0)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen "Status field %s can't be used with -t", field);
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainenstatus_output(struct status_cmd_context *ctx, struct mailbox *box,
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen doveadm_print(guid_128_to_string(metadata->guid));
a7bee3930831a9261fa6180d02af29c484d862e9Timo Sirainen struct mailbox_status *dest = &ctx->total_status;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ctx->total_metadata.virtual_size += metadata->virtual_size;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatus_mailbox(struct status_cmd_context *ctx, const struct mailbox_info *info)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen box = doveadm_mailbox_find(ctx->ctx.cur_mail_user, info->vname);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (mailbox_get_status(box, ctx->status_items, &status) < 0 ||
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mailbox_get_metadata(box, ctx->metadata_items, &metadata) < 0) {
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen i_error("Mailbox %s: Failed to lookup mailbox status: %s",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen mailbox_get_vname(box), mailbox_get_last_error(box, NULL));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainencmd_mailbox_status_run(struct doveadm_mail_cmd_context *_ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen memset(&ctx->total_status, 0, sizeof(ctx->total_status));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen memset(&ctx->total_metadata, 0, sizeof(ctx->total_metadata));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen iter = doveadm_mailbox_list_iter_init(_ctx, user, ctx->search_args,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void cmd_mailbox_status_init(struct doveadm_mail_cmd_context *_ctx,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *const args[])
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen status_parse_fields(ctx, t_strsplit_spaces(fields, " "));
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args+1);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_MESSAGES) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_UIDNEXT) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_UIDVALIDITY) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->status_items & STATUS_HIGHESTMODSEQ) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen if ((ctx->metadata_items & MAILBOX_METADATA_GUID) != 0)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void cmd_mailbox_status_deinit(struct doveadm_mail_cmd_context *_ctx)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainencmd_mailbox_status_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen struct status_cmd_context *ctx = (struct status_cmd_context *)_ctx;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_status_alloc(void)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct status_cmd_context);
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen ctx->ctx.v.parse_arg = cmd_mailbox_status_parse_arg;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ctx->ctx.v.deinit = cmd_mailbox_status_deinit;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_status_ver2 = {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<fields> <mailbox> [...]",
b42f37ae6f65ed986315b6885568d32115e589b1Timo SirainenDOVEADM_CMD_PARAM('t', "total-sum", CMD_PARAM_BOOL, 0)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo SirainenDOVEADM_CMD_PARAM('f', "field", CMD_PARAM_ARRAY, 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo SirainenDOVEADM_CMD_PARAM('\0', "fieldstr", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL | CMD_PARAM_FLAG_DO_NOT_EXPOSE) /* FIXME: horrible hack, remove me when possible */