diff --git a/src/mu-store.cc b/src/mu-store.cc index 376022d6..c53a82fc 100644 --- a/src/mu-store.cc +++ b/src/mu-store.cc @@ -441,15 +441,12 @@ each_contact_info (MuMsgContact *contact, MsgDoc *data) } /* don't normalize e-mail address, but do lowercase it */ - if (contact->address && strlen (contact->address)) { - char *lower = g_utf8_strdown (contact->address, -1); - - g_strdelimit (lower, "@.", '_'); /* FIXME */ - + if (contact->address && contact->address[0] != '\0') { + char *escaped = + mu_str_ascii_xapian_escape (contact->address); data->_doc->add_term - (std::string (*pfxp + lower, 0, - MU_STORE_MAX_TERM_LENGTH)); - g_free (lower); + (std::string (*pfxp + escaped, 0, MU_STORE_MAX_TERM_LENGTH)); + g_free (escaped); } } @@ -618,5 +615,3 @@ mu_store_foreach (MuStore *self, return MU_OK; } - - diff --git a/src/mu-str.c b/src/mu-str.c index b3110a12..e110b8e3 100644 --- a/src/mu-str.c +++ b/src/mu-str.c @@ -299,6 +299,7 @@ mu_str_date_parse_hdwmy (const char* str) } + char* mu_str_ascii_xapian_escape_in_place (char *query) { @@ -334,3 +335,10 @@ mu_str_ascii_xapian_escape_in_place (char *query) return query; } +char* +mu_str_ascii_xapian_escape (const char *query) +{ + g_return_val_if_fail (query, NULL); + + return mu_str_ascii_xapian_escape_in_place (g_strdup(query)); +} diff --git a/src/mu-str.h b/src/mu-str.h index 2c823bc9..009b386c 100644 --- a/src/mu-str.h +++ b/src/mu-str.h @@ -150,6 +150,7 @@ char* mu_str_normalize (const char *str, gboolean downcase) * optionally, downcase it. this happen by changing the string; if * that is not desired, use mu_str_normalize. Works for accented chars * in Unicode Blocks 'Latin-1 Supplement' and 'Latin Extended-A' + * * * @param str a valid utf8 string or NULL * @param downcase if TRUE, convert the string to lowercase @@ -165,7 +166,7 @@ char* mu_str_normalize_in_place (char *str, gboolean downcase); * replace ':' with '_', if it's not following a xapian-prefix (such * as 'subject:', 't:' etc, as defined in mu-msg-fields.[ch]). * changing is done in-place (by changing the argument string). in - * any, case, the string will be downcased. + * any case, the string will be downcased. * * works for ascii strings, like e-mail addresses and message-id. * @@ -175,6 +176,20 @@ char* mu_str_normalize_in_place (char *str, gboolean downcase); */ char* mu_str_ascii_xapian_escape_in_place (char *query); +/** + * escape the string for use with xapian matching. in practice, if the + * string contains an '@', replace '@', single-'.' with '_'. Also, + * replace ':' with '_', if it's not following a xapian-prefix (such + * as 'subject:', 't:' etc, as defined in mu-msg-fields.[ch]). + * + * works for ascii strings, like e-mail addresses and message-id. + * + * @param query a query string + * + * @return the escaped string (free with g_free) or NULL in case of error + */ +char* mu_str_ascii_xapian_escape (const char *query); + /** * * parse strings like 1h, 3w, 2m to mean '1 hour before now', '3 weeks