dovecot-2.2: fts: Use key=value instead of "key value" settings ...

dovecot at dovecot.org dovecot at dovecot.org
Sat May 9 14:00:03 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/82831550757b
changeset: 18596:82831550757b
user:      Timo Sirainen <tss at iki.fi>
date:      Sat May 09 16:58:09 2015 +0300
description:
fts: Use key=value instead of "key value" settings for tokenizers and filters.

diffstat:

 src/plugins/fts/fts-user.c |  49 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 35 insertions(+), 14 deletions(-)

diffs (89 lines):

diff -r 461bb302bd03 -r 82831550757b src/plugins/fts/fts-user.c
--- a/src/plugins/fts/fts-user.c	Sat May 09 15:11:48 2015 +0300
+++ b/src/plugins/fts/fts-user.c	Sat May 09 16:58:09 2015 +0300
@@ -26,6 +26,32 @@
 static MODULE_CONTEXT_DEFINE_INIT(fts_user_module,
 				  &mail_user_module_register);
 
+static const char *const *str_keyvalues_to_array(const char *str)
+{
+	const char *key, *value, *const *keyvalues;
+	ARRAY_TYPE(const_string) arr;
+	unsigned int i;
+
+	if (str == NULL)
+		return NULL;
+
+	t_array_init(&arr, 8);
+	keyvalues = t_strsplit_spaces(str, " ");
+	for (i = 0; keyvalues[i] != NULL; i++) {
+		value = strchr(keyvalues[i], '=');
+		if (value != NULL)
+			key = t_strdup_until(keyvalues[i], value++);
+		else {
+			key = keyvalues[i];
+			value = "";
+		}
+		array_append(&arr, &key, 1);
+		array_append(&arr, &value, 1);
+	}
+	array_append_zero(&arr);
+	return array_idx(&arr, 0);
+}
+
 static int
 fts_user_init_languages(struct mail_user *user, struct fts_user *fuser,
 			const char **error_r)
@@ -63,7 +89,7 @@
 	const struct fts_filter *filter_class;
 	struct fts_filter *filter = NULL, *parent = NULL;
 	const char *filters_key, *const *filters, *filter_set_name;
-	const char *str, *error, *set_key, *const *settings;
+	const char *str, *error, *set_key;
 	unsigned int i;
 	int ret = 0;
 
@@ -99,9 +125,9 @@
 			set_key = t_strdup_printf("fts_filters_%s", filter_set_name);
 			str = mail_user_plugin_getenv(user, set_key);
 		}
-		settings = str == NULL ? NULL : t_strsplit_spaces(str, " ");
 
-		if (fts_filter_create(filter_class, parent, lang, settings,
+		if (fts_filter_create(filter_class, parent, lang,
+				      str_keyvalues_to_array(str),
 				      &filter, &error) < 0) {
 			*error_r = t_strdup_printf(
 				"Filter '%s' init via settings '%s' failed: %s",
@@ -130,7 +156,7 @@
 	const struct fts_tokenizer *tokenizer_class;
 	struct fts_tokenizer *tokenizer = NULL, *parent = NULL;
 	const char *tokenizers_key, *const *tokenizers, *tokenizer_set_name;
-	const char *str, *error, *set_key, *const *settings;
+	const char *str, *error, *set_key;
 	unsigned int i;
 	int ret = 0;
 
@@ -156,17 +182,12 @@
 
 		/* tell the tokenizers that we're tokenizing a search string
 		   (instead of tokenizing indexed data) */
-		if (search) {
-			if (str == NULL)
-				str = "search yes";
-			else
-				str = t_strconcat(str, " search yes", NULL);
-		}
+		if (search)
+			str = t_strconcat("search=yes ", str, NULL);
 
-		settings = str == NULL ? NULL : t_strsplit_spaces(str, " ");
-
-		if (fts_tokenizer_create(tokenizer_class, parent, settings,
-				      &tokenizer, &error) < 0) {
+		if (fts_tokenizer_create(tokenizer_class, parent,
+					 str_keyvalues_to_array(str),
+					 &tokenizer, &error) < 0) {
 			*error_r = t_strdup_printf(
 				"Tokenizer '%s' init via settings '%s' failed: %s",
 				tokenizers[i], set_key, error);


More information about the dovecot-cvs mailing list