mail-search-register.c revision a8c5a86d183db25a57bf193c06b41e092ec2e151
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2014 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "lib.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "array.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "mail-search.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "mail-search-register.h"
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_search_register {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ARRAY(struct mail_search_register_arg) args;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_search_register_fallback_t *fallback;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int args_sorted:1;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_search_register *mail_search_register_init(void)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen{
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_search_register *reg;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen reg = i_new(struct mail_search_register, 1);
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen i_array_init(&reg->args, 64);
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return reg;
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen}
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mail_search_register_deinit(struct mail_search_register **_reg)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_search_register *reg = *_reg;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen *_reg = NULL;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_free(&reg->args);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_free(reg);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mail_search_register_add(struct mail_search_register *reg,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct mail_search_register_arg *arg,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int count)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen array_append(&reg->args, arg, count);
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen reg->args_sorted = FALSE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mail_search_register_fallback(struct mail_search_register *reg,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_search_register_fallback_t *fallback)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen reg->fallback = fallback;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainenmail_search_register_arg_cmp(const struct mail_search_register_arg *arg1,
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen const struct mail_search_register_arg *arg2)
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen{
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen return strcmp(arg1->key, arg2->key);
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenconst struct mail_search_register_arg *
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmail_search_register_get(struct mail_search_register *reg,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int *count_r)
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen{
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen if (!reg->args_sorted) {
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen array_sort(&reg->args, mail_search_register_arg_cmp);
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen reg->args_sorted = TRUE;
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen }
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen return array_get(&reg->args, count_r);
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen}
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainenconst struct mail_search_register_arg *
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainenmail_search_register_find(struct mail_search_register *reg, const char *key)
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen{
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen struct mail_search_register_arg arg;
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen
e3367d7b54864d2e4b1931903e3f660ae64fbe3aTimo Sirainen if (!reg->args_sorted) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_sort(&reg->args, mail_search_register_arg_cmp);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen reg->args_sorted = TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen arg.key = key;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return array_bsearch(&reg->args, &arg, mail_search_register_arg_cmp);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenbool mail_search_register_get_fallback(struct mail_search_register *reg,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_search_register_fallback_t **fallback_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen if (reg->fallback == NULL)
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen return FALSE;
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen *fallback_r = reg->fallback;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen