annotate src/lib-storage/mail-search-register-human.c @ 22713:cb108f786fb4

Updated copyright notices to include the year 2018.
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 01 Jan 2018 22:42:08 +0100
parents 2e2563132d5f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "array.h"
11408
15cda53f4e79 lib-storage: human search arg parser now gets mailbox name using UTF-8.
Timo Sirainen <tss@iki.fi>
parents: 11396
diff changeset
6 #include "str.h"
12629
02370eda76f8 lib-storage: Mailbox virtual names are now in UTF-8 format, not IMAP mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11601
diff changeset
7 #include "unichar.h"
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "settings-parser.h"
18176
b0fb4113fbbe lib-storage: Added mail_parse_human_timestamp() to parse human-writable timestamps.
Timo Sirainen <tss@iki.fi>
parents: 18147
diff changeset
9 #include "mail-storage.h"
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mail-search-register.h"
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
11 #include "mail-search-parser.h"
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "mail-search-build.h"
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <time.h>
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <ctype.h>
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct mail_search_register *mail_search_register_human;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 static struct mail_search_arg *
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
20 human_search_or(struct mail_search_build_context *ctx)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
22 struct mail_search_arg *sarg;
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
23
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 /* this changes the parent arg to be an OR block instead of AND block */
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 ctx->parent->type = SEARCH_OR;
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
26 if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
27 return NULL;
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
28 return sarg;
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 static struct mail_search_arg *
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 arg_new_human_date(struct mail_search_build_context *ctx,
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 enum mail_search_arg_type type,
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 enum mail_search_date_type date_type)
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct mail_search_arg *sarg;
18176
b0fb4113fbbe lib-storage: Added mail_parse_human_timestamp() to parse human-writable timestamps.
Timo Sirainen <tss@iki.fi>
parents: 18147
diff changeset
37 const char *value;
21067
73bf7db5f801 lib-storage: Fix doveadm search query parsing to use timezones correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
38 bool utc;
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 sarg = mail_search_build_new(ctx, type);
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
41 if (mail_search_parse_string(ctx->parser, &value) < 0)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 return NULL;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
21067
73bf7db5f801 lib-storage: Fix doveadm search query parsing to use timezones correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
44 if (mail_parse_human_timestamp(value, &sarg->value.time, &utc) < 0)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 sarg->value.time = (time_t)-1;
21067
73bf7db5f801 lib-storage: Fix doveadm search query parsing to use timezones correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
46 if (utc)
73bf7db5f801 lib-storage: Fix doveadm search query parsing to use timezones correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
47 sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 if (sarg->value.time == (time_t)-1) {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
50 ctx->_error = p_strconcat(ctx->pool,
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 "Invalid search date parameter: ", value, NULL);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 return NULL;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 sarg->value.date_type = date_type;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 return sarg;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 #define CALLBACK_DATE(_func, _type, _date_type) \
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 static struct mail_search_arg *\
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
60 human_search_##_func(struct mail_search_build_context *ctx) \
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 { \
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
62 return arg_new_human_date(ctx, _type, _date_type); \
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
14553
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
64 CALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
65 CALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED)
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
66 CALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
14553
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
68 CALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT)
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
69 CALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
70 CALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
14553
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
72 CALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
73 CALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
cb80c575b00c Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 14427
diff changeset
74 CALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 static struct mail_search_arg *
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 arg_new_human_size(struct mail_search_build_context *ctx,
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 enum mail_search_arg_type type)
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 struct mail_search_arg *sarg;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 const char *value, *error;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 sarg = mail_search_build_new(ctx, type);
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
84 if (mail_search_parse_string(ctx->parser, &value) < 0)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 return NULL;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 if (settings_get_size(value, &sarg->value.size, &error) < 0) {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
88 ctx->_error = p_strdup(ctx->pool, error);
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 return NULL;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 return sarg;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 static struct mail_search_arg *
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
95 human_search_larger(struct mail_search_build_context *ctx)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
97 return arg_new_human_size(ctx, SEARCH_LARGER);
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 static struct mail_search_arg *
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
101 human_search_smaller(struct mail_search_build_context *ctx)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
103 return arg_new_human_size(ctx, SEARCH_SMALLER);
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 static struct mail_search_arg *
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
107 human_search_guid(struct mail_search_build_context *ctx)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
109 return mail_search_build_str(ctx, SEARCH_GUID);
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 static struct mail_search_arg *
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11146
diff changeset
113 human_search_mailbox(struct mail_search_build_context *ctx)
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 {
11408
15cda53f4e79 lib-storage: human search arg parser now gets mailbox name using UTF-8.
Timo Sirainen <tss@iki.fi>
parents: 11396
diff changeset
115 struct mail_search_arg *sarg;
15cda53f4e79 lib-storage: human search arg parser now gets mailbox name using UTF-8.
Timo Sirainen <tss@iki.fi>
parents: 11396
diff changeset
116
14427
7a414d055b3c lib-storage: Human search builder now uses SEARCH_MAILBOX_GLOB only when wildcards are used.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
117 sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
11601
52e2f3a8054f lib-storage: Human search parser crashed if mailbox name was missing.
Timo Sirainen <tss@iki.fi>
parents: 11412
diff changeset
118 if (sarg == NULL)
52e2f3a8054f lib-storage: Human search parser crashed if mailbox name was missing.
Timo Sirainen <tss@iki.fi>
parents: 11412
diff changeset
119 return NULL;
52e2f3a8054f lib-storage: Human search parser crashed if mailbox name was missing.
Timo Sirainen <tss@iki.fi>
parents: 11412
diff changeset
120
14427
7a414d055b3c lib-storage: Human search builder now uses SEARCH_MAILBOX_GLOB only when wildcards are used.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
121 if (strchr(sarg->value.str, '*') != NULL ||
7a414d055b3c lib-storage: Human search builder now uses SEARCH_MAILBOX_GLOB only when wildcards are used.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
122 strchr(sarg->value.str, '%') != NULL)
7a414d055b3c lib-storage: Human search builder now uses SEARCH_MAILBOX_GLOB only when wildcards are used.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
123 sarg->type = SEARCH_MAILBOX_GLOB;
7a414d055b3c lib-storage: Human search builder now uses SEARCH_MAILBOX_GLOB only when wildcards are used.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
124
12629
02370eda76f8 lib-storage: Mailbox virtual names are now in UTF-8 format, not IMAP mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11601
diff changeset
125 if (!uni_utf8_str_is_valid(sarg->value.str)) {
11412
046948ccdbfb lib-storage: Human search parser now fails if given mailbox name isn't valid UTF8.
Timo Sirainen <tss@iki.fi>
parents: 11408
diff changeset
126 ctx->_error = p_strconcat(ctx->pool,
12629
02370eda76f8 lib-storage: Mailbox virtual names are now in UTF-8 format, not IMAP mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11601
diff changeset
127 "Mailbox name not valid UTF-8: ",
02370eda76f8 lib-storage: Mailbox virtual names are now in UTF-8 format, not IMAP mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11601
diff changeset
128 sarg->value.str, NULL);
11412
046948ccdbfb lib-storage: Human search parser now fails if given mailbox name isn't valid UTF8.
Timo Sirainen <tss@iki.fi>
parents: 11408
diff changeset
129 return NULL;
046948ccdbfb lib-storage: Human search parser now fails if given mailbox name isn't valid UTF8.
Timo Sirainen <tss@iki.fi>
parents: 11408
diff changeset
130 }
11408
15cda53f4e79 lib-storage: human search arg parser now gets mailbox name using UTF-8.
Timo Sirainen <tss@iki.fi>
parents: 11396
diff changeset
131 return sarg;
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
11232
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
134 static struct mail_search_arg *
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
135 human_search_mailbox_guid(struct mail_search_build_context *ctx)
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
136 {
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
137 return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
138 }
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
139
18147
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
140 static struct mail_search_arg *
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
141 human_search_oldestonly(struct mail_search_build_context *ctx)
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
142 {
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
143 ctx->args->stop_on_nonmatch = TRUE;
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
144 return mail_search_build_new(ctx, SEARCH_ALL);
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
145 }
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
146
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 static const struct mail_search_register_arg human_register_args[] = {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 { "OR", human_search_or },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 /* dates */
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 { "BEFORE", human_search_before },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 { "ON", human_search_on },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 { "SINCE", human_search_since },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 { "SENTBEFORE", human_search_sentbefore },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 { "SENTON", human_search_senton },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 { "SENTSINCE", human_search_sentsince },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 { "SAVEDBEFORE", human_search_savedbefore },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 { "SAVEDON", human_search_savedon },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 { "SAVEDSINCE", human_search_savedsince },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 { "X-SAVEDBEFORE", human_search_savedbefore },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 { "X-SAVEDON", human_search_savedon },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 { "X-SAVEDSINCE", human_search_savedsince },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 /* sizes */
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 { "LARGER", human_search_larger },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 { "SMALLER", human_search_smaller },
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 /* Other Dovecot extensions: */
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 { "GUID", human_search_guid },
11232
389a251c9cfe lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents: 11197
diff changeset
170 { "MAILBOX", human_search_mailbox },
18147
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
171 { "MAILBOX-GUID", human_search_mailbox_guid },
14bf136959bc lib-storage: Added "oldestonly" search arg to stop searching after the first non-match.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
172 { "OLDESTONLY", human_search_oldestonly }
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 };
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
11268
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
175 static struct mail_search_register *
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 mail_search_register_init_human(struct mail_search_register *imap_register)
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 struct mail_search_register *reg;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 mail_search_register_fallback_t *fallback;
15900
88c325e81c7c Minor code cleanup
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
180 ARRAY(struct mail_search_register_arg) copy_args;
11146
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 const struct mail_search_register_arg *human_args, *imap_args;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 unsigned int i, j, human_count, imap_count;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 int ret;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 reg = mail_search_register_init();
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 mail_search_register_add(reg, human_register_args,
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 N_ELEMENTS(human_register_args));
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 /* find and register args in imap that don't exist in human */
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 imap_args = mail_search_register_get(imap_register, &imap_count);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 human_args = mail_search_register_get(reg, &human_count);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 t_array_init(&copy_args, imap_count);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 for (i = j = 0; i < imap_count && j < human_count; ) {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 ret = strcmp(imap_args[i].key, human_args[j].key);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 if (ret < 0) {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 array_append(&copy_args, &imap_args[i], 1);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 i++;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 } else if (ret > 0) {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 j++;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 } else {
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 i++; j++;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 }
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 for (; i < imap_count; i++)
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 array_append(&copy_args, &imap_args[i], 1);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 imap_args = array_get(&copy_args, &imap_count);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 mail_search_register_add(reg, imap_args, imap_count);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 if (mail_search_register_get_fallback(imap_register, &fallback))
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 mail_search_register_fallback(reg, fallback);
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 return reg;
3649ad8c9f9a lib-storage: Added search query building from human-friendly input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 }
11268
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
214
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
215 struct mail_search_register *mail_search_register_get_human(void)
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
216 {
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
217 if (mail_search_register_human == NULL) {
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
218 struct mail_search_register *imap_reg =
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
219 mail_search_register_get_imap();
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
220
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
221 mail_search_register_human =
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
222 mail_search_register_init_human(imap_reg);
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
223 }
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
224 return mail_search_register_human;
0a35407e6ff4 Mail search register getting API change to fix a doveadm crash bug.
Timo Sirainen <tss@iki.fi>
parents: 11232
diff changeset
225 }