dovecot-2.0: lib-storage: Rewrote search query building code to ...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Apr 13 18:59:26 EEST 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/c6db5769942f
changeset: 11144:c6db5769942f
user: Timo Sirainen <tss at iki.fi>
date: Tue Apr 13 18:59:23 2010 +0300
description:
lib-storage: Rewrote search query building code to be more modular.
diffstat:
src/lib-storage/Makefile.am | 3 +
src/lib-storage/mail-search-build.c | 670 ++-------------------------------
src/lib-storage/mail-search-build.h | 10 +
src/lib-storage/mail-search-register-imap.c | 591 +++++++++++++++++++++++++++++
src/lib-storage/mail-search-register.c | 71 +++
src/lib-storage/mail-search-register.h | 44 ++
src/lib-storage/mail-storage-private.h | 2 +
src/lib-storage/mail-storage.c | 4 +
8 files changed, 774 insertions(+), 621 deletions(-)
diffs (truncated from 1527 to 300 lines):
diff -r 3e427a0c1790 -r c6db5769942f src/lib-storage/Makefile.am
--- a/src/lib-storage/Makefile.am Tue Apr 13 17:01:12 2010 +0300
+++ b/src/lib-storage/Makefile.am Tue Apr 13 18:59:23 2010 +0300
@@ -22,6 +22,8 @@
mail-namespace.c \
mail-search.c \
mail-search-build.c \
+ mail-search-register.c \
+ mail-search-register-imap.c \
mail-storage.c \
mail-storage-hooks.c \
mail-storage-settings.c \
@@ -41,6 +43,7 @@
mail-namespace.h \
mail-search.h \
mail-search-build.h \
+ mail-search-register.h \
mail-thread.h \
mail-storage.h \
mail-storage-private.h \
diff -r 3e427a0c1790 -r c6db5769942f src/lib-storage/mail-search-build.c
--- a/src/lib-storage/mail-search-build.c Tue Apr 13 17:01:12 2010 +0300
+++ b/src/lib-storage/mail-search-build.c Tue Apr 13 18:59:23 2010 +0300
@@ -1,644 +1,70 @@
/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
#include "lib.h"
-#include "ioloop.h"
-#include "imap-date.h"
#include "imap-arg.h"
-#include "imap-seqset.h"
+#include "mail-storage-private.h"
+#include "mail-search-register.h"
#include "mail-search-build.h"
-#include "mail-storage.h"
#include <stdlib.h>
-struct search_build_data {
- pool_t pool;
- const char *error;
-};
+struct mail_search_arg *
+mail_search_build_next(struct mail_search_build_context *ctx,
+ const struct imap_arg **imap_args)
+{
+ struct mail_search_arg **subargs, *sarg;
+ const struct imap_arg *listargs;
+ const char *key;
+ const struct mail_search_register_arg *reg_arg;
+ mail_search_register_fallback_t *fallback;
-static struct mail_search_arg *
-search_arg_new(pool_t pool, enum mail_search_arg_type type)
-{
- struct mail_search_arg *arg;
-
- arg = p_new(pool, struct mail_search_arg, 1);
- arg->type = type;
-
- return arg;
-}
-
-static bool
-arg_get_next(struct search_build_data *data, const struct imap_arg **args,
- const char **value_r)
-{
- if (IMAP_ARG_IS_EOL(*args)) {
- data->error = "Missing parameter for argument";
- return FALSE;
- }
- if (!imap_arg_get_astring(*args, value_r)) {
- data->error = "Invalid parameter for argument";
- return FALSE;
+ if (IMAP_ARG_IS_EOL(*imap_args)) {
+ ctx->error = "Missing argument";
+ return NULL;
}
- *args += 1;
- return TRUE;
-}
-
-#define ARG_NEW_SINGLE(type) \
- arg_new_single(data, next_sarg, type)
-static bool
-arg_new_single(struct search_build_data *data,
- struct mail_search_arg **next_sarg,
- enum mail_search_arg_type type)
-{
- *next_sarg = search_arg_new(data->pool, type);
- return TRUE;
-}
-
-#define ARG_NEW_STR(type) \
- arg_new_str(data, args, next_sarg, type)
-static bool
-arg_new_str(struct search_build_data *data,
- const struct imap_arg **args, struct mail_search_arg **next_sarg,
- enum mail_search_arg_type type)
-{
- struct mail_search_arg *sarg;
- const char *value;
-
- *next_sarg = sarg = search_arg_new(data->pool, type);
- if (!arg_get_next(data, args, &value))
- return FALSE;
- sarg->value.str = p_strdup(data->pool, value);
- return TRUE;
-}
-
-#define ARG_NEW_FLAGS(flags) \
- arg_new_flags(data, next_sarg, flags)
-static bool
-arg_new_flags(struct search_build_data *data,
- struct mail_search_arg **next_sarg, enum mail_flags flags)
-{
- struct mail_search_arg *sarg;
-
- *next_sarg = sarg = search_arg_new(data->pool, SEARCH_FLAGS);
- sarg->value.flags = flags;
- return TRUE;
-}
-
-#define ARG_NEW_SIZE(type) \
- arg_new_size(data, args, next_sarg, type)
-static bool
-arg_new_size(struct search_build_data *data,
- const struct imap_arg **args, struct mail_search_arg **next_sarg,
- enum mail_search_arg_type type)
-{
- struct mail_search_arg *sarg;
- const char *value;
-
- *next_sarg = sarg = search_arg_new(data->pool, type);
- if (!arg_get_next(data, args, &value))
- return FALSE;
-
- if (str_to_uoff(value, &sarg->value.size) < 0) {
- data->error = "Invalid search size parameter";
- return FALSE;
- }
- return TRUE;
-}
-
-#define ARG_NEW_DATE(type, date_type) \
- arg_new_date(data, args, next_sarg, type, date_type)
-static bool
-arg_new_date(struct search_build_data *data,
- const struct imap_arg **args, struct mail_search_arg **next_sarg,
- enum mail_search_arg_type type,
- enum mail_search_date_type date_type)
-{
- struct mail_search_arg *sarg;
- const char *value;
-
- *next_sarg = sarg = search_arg_new(data->pool, type);
- if (!arg_get_next(data, args, &value))
- return FALSE;
- if (!imap_parse_date(value, &sarg->value.time)) {
- data->error = "Invalid search date parameter";
- return FALSE;
- }
- sarg->value.date_type = date_type;
- return TRUE;
-}
-
-#define ARG_NEW_INTERVAL(type) \
- arg_new_interval(data, args, next_sarg, type)
-static bool
-arg_new_interval(struct search_build_data *data,
- const struct imap_arg **args,
- struct mail_search_arg **next_sarg,
- enum mail_search_arg_type type)
-{
- struct mail_search_arg *sarg;
- const char *value;
- uint32_t interval;
-
- *next_sarg = sarg = search_arg_new(data->pool, type);
- if (!arg_get_next(data, args, &value))
- return FALSE;
-
- if (str_to_uint32(value, &interval) < 0 || interval == 0) {
- data->error = "Invalid search interval parameter";
- return FALSE;
- }
- sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
- sarg->value.time = ioloop_time - interval;
- return TRUE;
-}
-
-#define ARG_NEW_HEADER(type, hdr_name) \
- arg_new_header(data, args, next_sarg, type, hdr_name)
-static bool
-arg_new_header(struct search_build_data *data,
- const struct imap_arg **args, struct mail_search_arg **next_sarg,
- enum mail_search_arg_type type, const char *hdr_name)
-{
- struct mail_search_arg *sarg;
- const char *value;
-
- *next_sarg = sarg = search_arg_new(data->pool, type);
- if (!arg_get_next(data, args, &value))
- return FALSE;
-
- sarg->hdr_field_name = p_strdup(data->pool, hdr_name);
- sarg->value.str = p_strdup(data->pool, value);
- return TRUE;
-}
-
-static bool
-arg_modseq_set_name(struct search_build_data *data,
- struct mail_search_arg *sarg, const char *name)
-{
- name = t_str_lcase(name);
- if (strncmp(name, "/flags/", 7) != 0) {
- data->error = "Invalid MODSEQ entry";
- return FALSE;
- }
- name += 7;
-
- if (*name == '\\') {
- /* system flag */
- name++;
- if (strcmp(name, "answered") == 0)
- sarg->value.flags = MAIL_ANSWERED;
- else if (strcmp(name, "flagged") == 0)
- sarg->value.flags = MAIL_FLAGGED;
- else if (strcmp(name, "deleted") == 0)
- sarg->value.flags = MAIL_DELETED;
- else if (strcmp(name, "seen") == 0)
- sarg->value.flags = MAIL_SEEN;
- else if (strcmp(name, "draft") == 0)
- sarg->value.flags = MAIL_DRAFT;
- else {
- data->error = "Invalid MODSEQ system flag";
- return FALSE;
- }
- return TRUE;
- }
- sarg->value.str = p_strdup(data->pool, name);
- return TRUE;
-}
-
-static bool
-arg_modseq_set_type(struct search_build_data *data,
- struct mail_search_modseq *modseq, const char *name)
-{
- if (strcasecmp(name, "all") == 0)
- modseq->type = MAIL_SEARCH_MODSEQ_TYPE_ANY;
- else if (strcasecmp(name, "priv") == 0)
- modseq->type = MAIL_SEARCH_MODSEQ_TYPE_PRIVATE;
- else if (strcasecmp(name, "shared") == 0)
- modseq->type = MAIL_SEARCH_MODSEQ_TYPE_SHARED;
- else {
- data->error = "Invalid MODSEQ type";
- return FALSE;
- }
- return TRUE;
-}
-
-#define ARG_NEW_MODSEQ() \
- arg_new_modseq(data, args, next_sarg)
-static bool
-arg_new_modseq(struct search_build_data *data,
- const struct imap_arg **args, struct mail_search_arg **next_sarg)
-{
- struct mail_search_arg *sarg;
- const char *value;
-
- *next_sarg = sarg = search_arg_new(data->pool, SEARCH_MODSEQ);
- if (!arg_get_next(data, args, &value))
- return FALSE;
-
- sarg->value.modseq = p_new(data->pool, struct mail_search_modseq, 1);
- if ((*args)[-1].type == IMAP_ARG_STRING) {
- /* <name> <type> */
- if (!arg_modseq_set_name(data, sarg, value))
- return FALSE;
-
- if (!arg_get_next(data, args, &value))
- return FALSE;
- if (!arg_modseq_set_type(data, sarg->value.modseq, value))
- return FALSE;
-
- if (!arg_get_next(data, args, &value))
- return FALSE;
- }
- if (str_to_uint64(value, &sarg->value.modseq->modseq) < 0) {
- data->error = "Invalid MODSEQ value";
- return FALSE;
- }
- return TRUE;
-}
-
-static bool search_arg_build(struct search_build_data *data,
- const struct imap_arg **args,
- struct mail_search_arg **next_sarg)
-{
More information about the dovecot-cvs
mailing list