#include "index-attachment.h"
#include "index-thread-private.h"
#include "index-mailbox-size.h"
+#include "settings-parser.h"
#include <time.h>
#include <unistd.h>
MODULE_CONTEXT_INIT(&mail_storage_module_register);
static void set_cache_decisions(struct mailbox *box,
- const char *set, const char *fields,
+ const char *set, const ARRAY_TYPE(const_string) *fields,
enum mail_cache_decision_type dec)
{
struct mail_cache *cache = box->cache;
const char *const *arr;
unsigned int idx;
- if (fields == NULL || *fields == '\0')
- return;
-
- for (arr = t_strsplit_spaces(fields, " ,"); *arr != NULL; arr++) {
+ for (arr = settings_boollist_get(fields); *arr != NULL; arr++) {
const char *name = *arr;
idx = mail_cache_register_lookup(cache, name);
MAIL_INDEX_CACHE_FIELD_COUNT,
MAIL_CACHE_TRUNCATE_NAME_FAIL);
- if (strcmp(set->mail_never_cache_fields, "*") == 0) {
+ if (str_array_find(settings_boollist_get(&set->mail_never_cache_fields), "*")) {
/* all caching disabled for now */
box->mail_cache_disabled = TRUE;
return;
}
set_cache_decisions(box, "mail_cache_fields",
- set->mail_cache_fields,
+ &set->mail_cache_fields,
MAIL_CACHE_DECISION_TEMP);
set_cache_decisions(box, "mail_always_cache_fields",
- set->mail_always_cache_fields,
+ &set->mail_always_cache_fields,
MAIL_CACHE_DECISION_YES |
MAIL_CACHE_DECISION_FORCED);
set_cache_decisions(box, "mail_never_cache_fields",
- set->mail_never_cache_fields,
+ &set->mail_never_cache_fields,
MAIL_CACHE_DECISION_NO |
MAIL_CACHE_DECISION_FORCED);
}
{ .type = SET_FILTER_NAME, .key = "mail_attribute",
.required_setting = "dict", },
DEF(UINT, mail_prefetch_count),
- DEF(STR, mail_cache_fields),
- DEF(STR, mail_always_cache_fields),
- DEF(STR, mail_never_cache_fields),
+ DEF(BOOLLIST, mail_cache_fields),
+ DEF(BOOLLIST, mail_always_cache_fields),
+ DEF(BOOLLIST, mail_never_cache_fields),
DEF(STR, mail_server_comment),
DEF(STR, mail_server_admin),
DEF(TIME_HIDDEN, mail_cache_unaccessed_field_drop),
.mail_ext_attachment_min_size = 1024*128,
.mail_attachment_detection_options = ARRAY_INIT,
.mail_prefetch_count = 0,
- .mail_cache_fields = "flags",
- .mail_always_cache_fields = "",
- .mail_never_cache_fields = "imap.envelope",
+ .mail_always_cache_fields = ARRAY_INIT,
.mail_server_comment = "",
.mail_server_admin = "",
.mail_cache_min_mail_count = 0,
static const struct setting_keyvalue mail_storage_default_settings_keyvalue[] = {
{ "layout_index/mailbox_list_storage_escape_char", "^" },
+ { "mail_cache_fields", "flags" },
+ { "mail_never_cache_fields", "imap.envelope" },
{ NULL, NULL }
};
}
/* <settings checks> */
-static bool mail_cache_fields_parse(const char *key, const char *value,
+static bool mail_cache_fields_parse(const char *key,
+ const ARRAY_TYPE(const_string) *value,
const char **error_r)
{
const char *const *arr;
+ bool has_asterisk = FALSE;
+ size_t fields_count = 0;
- if (value == set_value_unknown)
- return TRUE;
-
- for (arr = t_strsplit_spaces(value, " ,"); *arr != NULL; arr++) {
+ for (arr = settings_boollist_get(value); *arr != NULL; arr++) {
const char *name = *arr;
if (str_begins_icase(name, "hdr.", &name) &&
"Invalid %s: %s is not a valid header name",
key, name);
return FALSE;
+ } else if (strcmp(name, "*") == 0) {
+ has_asterisk = TRUE;
}
+ fields_count++;
+ }
+ if (has_asterisk && fields_count > 1) {
+ *error_r = t_strdup_printf(
+ "Invalid %s: has multiple values while having \"*\" set", key);
+ return FALSE;
}
return TRUE;
}
}
if (!mail_cache_fields_parse("mail_cache_fields",
- set->mail_cache_fields, error_r))
+ &set->mail_cache_fields, error_r))
return FALSE;
if (!mail_cache_fields_parse("mail_always_cache_fields",
- set->mail_always_cache_fields, error_r))
+ &set->mail_always_cache_fields, error_r))
return FALSE;
if (!mail_cache_fields_parse("mail_never_cache_fields",
- set->mail_never_cache_fields, error_r))
+ &set->mail_never_cache_fields, error_r))
return FALSE;
if ((fname = strrchr(set->mailbox_list_index_prefix, '/')) == NULL)