bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2011-2018 Dovecot authors, see the included COPYING file */
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen#include "lib.h"
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen#include "doveadm-dump.h"
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen#include "doveadm-fts.h"
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen#include "lucene-wrapper.h"
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen#include <stdio.h>
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen#include <sys/stat.h>
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
bd63b5b860658b01b1f46f26d406e1e4a9dc019aTimo Sirainenconst char *doveadm_fts_lucene_plugin_version = DOVECOT_ABI_VERSION;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainenvoid doveadm_fts_lucene_plugin_init(struct module *module);
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainenvoid doveadm_fts_lucene_plugin_deinit(void);
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainenstatic void cmd_dump_fts_lucene(int argc ATTR_UNUSED, char *argv[])
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen{
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen struct lucene_index *index;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen struct lucene_index_iter *iter;
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen guid_128_t prev_guid;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen const struct lucene_index_record *rec;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen bool first = TRUE;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch i_zero(&prev_guid);
c37098f8ce6d512ba41f09564d04ed25720f0a77Timo Sirainen index = lucene_index_init(argv[1], NULL, NULL);
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen iter = lucene_index_iter_init(index);
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen while ((rec = lucene_index_iter_next(iter)) != NULL) {
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen if (memcmp(prev_guid, rec->mailbox_guid,
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen sizeof(prev_guid)) != 0) {
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen if (first)
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen first = FALSE;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen else
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen printf("\n");
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen memcpy(prev_guid, rec->mailbox_guid, sizeof(prev_guid));
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen printf("%s: ", guid_128_to_string(prev_guid));
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen }
57b523eeb99ed5d7f5002907a409cdef54353ce5Timo Sirainen printf("%u", rec->uid);
57b523eeb99ed5d7f5002907a409cdef54353ce5Timo Sirainen if (rec->part_num != 0)
57b523eeb99ed5d7f5002907a409cdef54353ce5Timo Sirainen printf("[%u]", rec->part_num);
57b523eeb99ed5d7f5002907a409cdef54353ce5Timo Sirainen printf("\n");
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen }
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen printf("\n");
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen if (lucene_index_iter_deinit(&iter) < 0)
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen i_error("Lucene index iteration failed");
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen lucene_index_deinit(index);
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen}
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainenstatic bool test_dump_fts_lucene(const char *path)
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen{
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen struct stat st;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
5ab440dddf60e749ea988869552d3425fdc2512aTimo Sirainen path = t_strconcat(path, "/segments.gen", NULL);
5ab440dddf60e749ea988869552d3425fdc2512aTimo Sirainen return stat(path, &st) == 0;
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen}
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
0b3e92b6043435c5aa9f1cf1d04b632f3e19abd9Phil Carmodystatic const struct doveadm_cmd_dump doveadm_cmd_dump_fts_lucene = {
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen "fts-lucene",
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen test_dump_fts_lucene,
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen cmd_dump_fts_lucene
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen};
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainenvoid doveadm_fts_lucene_plugin_init(struct module *module ATTR_UNUSED)
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen{
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen doveadm_dump_register(&doveadm_cmd_dump_fts_lucene);
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen}
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainenvoid doveadm_fts_lucene_plugin_deinit(void)
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen{
39ed514f9d401b3cb589595c6a2f532050254d77Timo Sirainen}