bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen#define INDEXER_HANDSHAKE "VERSION\tindexer\t1\t0\n"
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenstatic int cmd_index_box_precache(struct mailbox *box)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (mailbox_get_metadata(box, MAILBOX_METADATA_PRECACHE_FIELDS,
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen i_error("Mailbox %s: Precache-fields lookup failed: %s",
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen if (mailbox_get_status(box, STATUS_MESSAGES | STATUS_LAST_CACHED_SEQ,
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen i_error("Mailbox %s: Status lookup failed: %s",
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen mailbox_get_vname(box), seq, status.messages);
0dab9cb35a976c49b28a11e28d5570f5191f1a7aMartti Rannanjärvi trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen mail_search_build_add_seqset(search_args, seq, status.messages);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen ctx = mailbox_search_init(trans, search_args, NULL,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (doveadm_verbose && ++counter % 100 == 0) {
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen i_error("Mailbox %s: Transaction commit failed: %s",
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
fcaf124d4a727424a338cccfd4274c2393818cd3Timo Sirainencmd_index_box(struct index_cmd_context *ctx, const struct mailbox_info *info)
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen box = mailbox_alloc(info->ns->list, info->vname,
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen /* index only if there aren't too many recent messages.
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen don't bother syncing the mailbox, that alone can take a
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen while with large maildirs. */
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen i_error("Opening mailbox %s failed: %s", info->vname,
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen mailbox_get_open_status(box, STATUS_RECENT, &status);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen i_error("Syncing mailbox %s failed: %s", info->vname,
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi mailbox_get_last_internal_error(box, NULL));
0950aed81d1e9618264e6aa4d214d89e005ec8d6Timo Sirainenstatic void index_queue_connect(struct index_cmd_context *ctx)
0950aed81d1e9618264e6aa4d214d89e005ec8d6Timo Sirainen path = t_strconcat(doveadm_settings->base_dir,
0950aed81d1e9618264e6aa4d214d89e005ec8d6Timo Sirainen i_fatal("net_connect_unix(%s) failed: %m", path);
0950aed81d1e9618264e6aa4d214d89e005ec8d6Timo Sirainen if (write_full(ctx->queue_fd, INDEXER_HANDSHAKE,
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainenstatic void cmd_index_queue(struct index_cmd_context *ctx,
fcaf124d4a727424a338cccfd4274c2393818cd3Timo Sirainen str_printfa(str, "\t%u\n", ctx->max_recent_msgs);
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen if (write_full(ctx->queue_fd, str_data(str), str_len(str)) < 0)
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainencmd_index_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const enum mailbox_list_iter_flags iter_flags =
3e0bae44b65f5c46989fcef3d1e07203f496327eTimo Sirainen const enum mail_namespace_type ns_mask = MAIL_NAMESPACE_TYPE_MASK_ALL;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen unsigned int i;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen /* we can do this quickly without going through the mailboxes */
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen iter = mailbox_list_iter_init_namespaces(user->namespaces, _ctx->args,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
d4847b921058734e0668bc7690465c91523d9ec0Martti Rannanjärvi mailbox_list_get_last_internal_error(user->namespaces->list, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainenstatic void cmd_index_init(struct doveadm_mail_cmd_context *_ctx,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *const args[])
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen unsigned int i;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainenstatic void cmd_index_deinit(struct doveadm_mail_cmd_context *_ctx)
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainencmd_index_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (str_to_uint(optarg, &ctx->max_recent_msgs) < 0) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_index_alloc(void)
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct index_cmd_context);
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-q] [-n <max recent>] <mailbox mask>",
fed9f797a9d7647f78eeec3fcea91972ed45bbbeAki TuomiDOVEADM_CMD_PARAM('n',"max-recent",CMD_PARAM_STR,0)