Mercurial > dovecot > core-2.2
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 |
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 | 64 CALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED) |
65 CALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED) | |
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 | 68 CALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT) |
69 CALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT) | |
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 | 72 CALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED) |
73 CALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED) | |
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 | 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(©_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(©_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(©_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(©_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 } |