mail-search-register.c revision 0dffa25d211be541ee3c953b23566a1a990789df
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen#include "lib.h"
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen#include "array.h"
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen#include "mail-search.h"
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "mail-search-register.h"
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainenstruct mail_search_register {
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen ARRAY(struct mail_search_register_arg) args;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen mail_search_register_fallback_t *fallback;
a8fe899601735459641edae975c0fa08be8482e2Timo Sirainen
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen bool args_sorted:1;
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen};
643a81fff9003cba13deb49a565a3c8171da524dTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenstruct mail_search_register *mail_search_register_init(void)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen{
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen struct mail_search_register *reg;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen reg = i_new(struct mail_search_register, 1);
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen i_array_init(&reg->args, 64);
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen return reg;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen}
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen
fcaf124d4a727424a338cccfd4274c2393818cd3Timo Sirainenvoid mail_search_register_deinit(struct mail_search_register **_reg)
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen{
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen struct mail_search_register *reg = *_reg;
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen
6c00502d4ece417ead501db8f0ee3e8287ba4459Timo Sirainen *_reg = NULL;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen array_free(&reg->args);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen i_free(reg);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen}
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenvoid mail_search_register_add(struct mail_search_register *reg,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen const struct mail_search_register_arg *arg,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen unsigned int count)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen array_append(&reg->args, arg, count);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen reg->args_sorted = FALSE;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen}
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainenvoid mail_search_register_fallback(struct mail_search_register *reg,
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen mail_search_register_fallback_t *fallback)
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen{
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen reg->fallback = fallback;
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen}
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainenstatic int
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainenmail_search_register_arg_cmp(const struct mail_search_register_arg *arg1,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen const struct mail_search_register_arg *arg2)
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen return strcmp(arg1->key, arg2->key);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen}
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenconst struct mail_search_register_arg *
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenmail_search_register_get(struct mail_search_register *reg,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen unsigned int *count_r)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (!reg->args_sorted) {
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen array_sort(&reg->args, mail_search_register_arg_cmp);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen reg->args_sorted = TRUE;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen }
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen return array_get(&reg->args, count_r);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen}
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenconst struct mail_search_register_arg *
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenmail_search_register_find(struct mail_search_register *reg, const char *key)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen struct mail_search_register_arg arg;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (!reg->args_sorted) {
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen array_sort(&reg->args, mail_search_register_arg_cmp);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen reg->args_sorted = TRUE;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen }
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen arg.key = key;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen return array_bsearch(&reg->args, &arg, mail_search_register_arg_cmp);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen}
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenbool mail_search_register_get_fallback(struct mail_search_register *reg,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen mail_search_register_fallback_t **fallback_r)
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen{
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen if (reg->fallback == NULL)
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen return FALSE;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen *fallback_r = reg->fallback;
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen return TRUE;
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen}
6a262c9bd8f57cf1e57112e0522dbdab28ae8c29Timo Sirainen