doveadm-mail-index.c revision 61cf001f1944d92eb25f113ba4c08985d6e30d53
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
7bd72e4deca3cbf757dd1ea298486d9f3bc24226Timo Sirainen#define INDEXER_HANDSHAKE "VERSION\tindexer\t1\t0\n"
5c99eaa4e3e07ee065580d163240b4ce95b66befTimo Sirainenstatic int cmd_index_box_precache(struct mailbox *box)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen if (mailbox_get_metadata(box, MAILBOX_METADATA_PRECACHE_FIELDS,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen i_error("Mailbox %s: Precache-fields lookup failed: %s",
7bd72e4deca3cbf757dd1ea298486d9f3bc24226Timo Sirainen if (mailbox_get_status(box, STATUS_MESSAGES | STATUS_LAST_CACHED_SEQ,
7bd72e4deca3cbf757dd1ea298486d9f3bc24226Timo Sirainen i_error("Mailbox %s: Status lookup failed: %s",
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen mailbox_get_vname(box), seq, status.messages);
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC);
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen mail_search_build_add_seqset(search_args, seq, status.messages);
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen ctx = mailbox_search_init(trans, search_args, NULL,
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen if (doveadm_verbose && ++counter % 100 == 0) {
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen i_error("Mailbox %s: Transaction commit failed: %s",
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainencmd_index_box(struct index_cmd_context *ctx, const struct mailbox_info *info)
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen box = mailbox_alloc(info->ns->list, info->vname,
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen /* index only if there aren't too many recent messages.
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen don't bother syncing the mailbox, that alone can take a
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen while with large maildirs. */
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen i_error("Opening mailbox %s failed: %s", info->vname,
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen mailbox_get_open_status(box, STATUS_RECENT, &status);
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen i_error("Syncing mailbox %s failed: %s", info->vname,
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainenstatic void index_queue_connect(struct index_cmd_context *ctx)
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen path = t_strconcat(doveadm_settings->base_dir,
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen i_fatal("net_connect_unix(%s) failed: %m", path);
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen if (write_full(ctx->queue_fd, INDEXER_HANDSHAKE,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainenstatic void cmd_index_queue(struct index_cmd_context *ctx,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen str_printfa(str, "\t%u\n", ctx->max_recent_msgs);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen if (write_full(ctx->queue_fd, str_data(str), str_len(str)) < 0)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainencmd_index_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
0727e38ac12efb8963a339daf56255e2be1f29fcTimo Sirainen const enum mailbox_list_iter_flags iter_flags =
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen const enum mail_namespace_type ns_mask = MAIL_NAMESPACE_TYPE_MASK_ALL;
747e77e3ab073a8e9e69c7a3e71b4593c5655d03Timo Sirainen unsigned int i;
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen /* we can do this quickly without going through the mailboxes */
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen iter = mailbox_list_iter_init_namespaces(user->namespaces, _ctx->args,
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen mailbox_list_get_last_internal_error(user->namespaces->list, NULL));
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainenstatic void cmd_index_init(struct doveadm_mail_cmd_context *_ctx,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen const char *const args[])
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen unsigned int i;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstatic void cmd_index_deinit(struct doveadm_mail_cmd_context *_ctx)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainencmd_index_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct index_cmd_context *ctx = (struct index_cmd_context *)_ctx;