FTS_FILTER"_"#name, name, struct fts_settings)
static const struct setting_define fts_setting_defines[] = {
- { .type = SET_FILTER_NAME, .key = FTS_FILTER },
+ { .type = SET_FILTER_ARRAY, .key = FTS_FILTER,
+ .offset = offsetof(struct fts_settings, fts),
+ .filter_array_field_name = "fts_driver", },
DEF(BOOL, autoindex),
DEF(UINT, autoindex_max_recent_msgs),
DEF(ENUM, decoder_driver),
/* </settings checks> */
static const struct fts_settings fts_default_settings = {
+ .fts = ARRAY_INIT,
.autoindex = FALSE,
.autoindex_max_recent_msgs = 0,
.decoder_driver = FTS_DECODER_KEYWORD_NONE
&set, &error) < 0) {
flist->failed = TRUE;
e_error(ns->list->event, "fts: %s", error);
- } else if (set->driver[0] == '\0') {
+ return;
+ }
+ if (array_is_empty(&set->fts)) {
e_debug(ns->list->event,
- "fts: No fts_driver setting - plugin disabled");
- } else if (fts_backend_init(set->driver, ns, ns->list->event,
- &error, &backend) < 0) {
+ "fts: No fts { .. } named list filter - plugin disabled");
+ settings_free(set);
+ return;
+ }
+
+ const char *fts_name_first =
+ t_strdup(array_idx_elem(&set->fts, 0));
+ if (array_count(&set->fts) > 1) {
+ /* Currently only a single fts is supported */
+ const char *fts_name_extra = array_idx_elem(&set->fts, 1);
+ e_error(ns->list->event,
+ "fts: Extra fts %s { .. } named list filter - "
+ "only one is currently supported, and "
+ "fts %s { .. } is already set",
+ fts_name_extra, fts_name_first);
+ flist->failed = TRUE;
+ settings_free(set);
+ return;
+ }
+
+ /* Get settings for the first fts list filter */
+ struct event *event = event_create(ns->list->event);
+ event_add_str(event, "fts", fts_name_first);
+ settings_free(set);
+ if (settings_get(event, &fts_setting_parser_info, 0,
+ &set, &error) < 0) {
+ flist->failed = TRUE;
+ e_error(ns->list->event, "fts: %s", error);
+ event_unref(&event);
+ return;
+ }
+
+ if (fts_backend_init(set->driver, ns, event, &error, &backend) < 0) {
flist->failed = TRUE;
e_error(ns->list->event,
"fts: Failed to initialize backend '%s': %s",
if ((flist->backend->flags & FTS_BACKEND_FLAG_FUZZY_SEARCH) != 0)
ns->user->fuzzy_search = TRUE;
}
+ event_unref(&event);
settings_free(set);
}