doveadm-mail-index.c revision 643a81fff9003cba13deb49a565a3c8171da524d
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen/* Copyright (c) 2010-2011 Dovecot authors, see the included COPYING file */
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic enum cache_mask cache_fields_get(const struct mailbox_status *status)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *const *cache_fields;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen unsigned int i, count;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen cache_fields = array_get(status->cache_fields, &count);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen for (i = 0; i < count; i++) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen if (strncmp(cache_fields[i], "hdr.", 4) == 0 ||
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen strcmp(cache_fields[i], "imap.envelope") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "mime.parts") == 0 ||
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen strcmp(cache_fields[i], "imap.bodystructure") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "date.received") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "date.save") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "size.virtual") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "size.physical") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "pop3.uidl") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen else if (strcmp(cache_fields[i], "guid") == 0)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic int cache_add(struct mailbox *box, const struct mailbox_status *status,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *str;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen i_debug("%s: Nothing in mailbox cache, skipping",
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen /* find the first message we need to index */
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen for (seq = status->messages; seq > 0; seq--) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen i_debug("%s: Caching mails seq=%u..%u cache=0x%x",
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen (void)mail_get_special(mail, MAIL_FETCH_UIDL_BACKEND,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen (void)mail_get_special(mail, MAIL_FETCH_GUID, &str);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mail_storage_get_last_error(mailbox_get_storage(box), NULL));
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic int fts_update(struct mailbox *box, const struct mailbox_status *status)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen /* a bit kludgy way to trigger the full text search update:
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen search for a string in the last message */
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_BODY_FAST);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen ctx = mailbox_search_init(t, search_args, NULL);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen storage_name = mail_namespace_get_storage_name(info->ns, info->name);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen box = mailbox_alloc(info->ns->list, storage_name,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen i_error("Syncing mailbox %s failed: %s", info->name,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mail_storage_get_last_error(mailbox_get_storage(box), NULL));
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mailbox_get_status(box, STATUS_MESSAGES | STATUS_CACHE_FIELDS, &status);
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainencmd_index_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const enum mailbox_list_iter_flags iter_flags =
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen NAMESPACE_PRIVATE | NAMESPACE_SHARED | NAMESPACE_PUBLIC;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen if (mail_user_plugin_getenv(user, "fts") != NULL) T_BEGIN {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *const *plugins;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen plugins = t_strsplit(user->set->mail_plugins, " ");
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen iter = mailbox_list_iter_init_namespaces(user->namespaces, ctx->args,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic void cmd_index_init(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen const char *const args[])
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_index_alloc(void)