fts-backend-solr-old.c revision 683d9f20766cd13e72f7d16ce1e341a8811b2679
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen/* Copyright (c) 2006-2012 Dovecot authors, see the included COPYING file */
1b4441e3e6f9e78ebeae8218de971959cd55bf60Timo Sirainen /* Valid characters in XML:
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] |
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen [#x10000-#x10FFFF]
55773f17bccf6361d6599ffcbe072d7c9fe205bfTimo Sirainen This function gets called only for #x80 and higher */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenxml_encode_data(string_t *dest, const unsigned char *data, unsigned int len)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen unsigned int i;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen for (i = 0; i < len; i++) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen switch (data[i]) {
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen /* exceptions to the following control char check */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* SOLR doesn't like control characters.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen replace them with spaces. */
6389aeec8c26b585e583c364b48ad12adf741898Timo Sirainen /* make sure the character is valid for XML
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen so we don't get XML parser errors */
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen unsigned int char_len =
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen uni_utf8_get_char_n(data + i, char_len, &chr) == 1 &&
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainenstatic void xml_encode(string_t *dest, const char *str)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen xml_encode_data(dest, (const unsigned char *)str, strlen(str));
33d63688ed8b26dc333e3c2edbfb2fe6e412604dTimo Sirainenstatic const char *solr_escape_id_str(const char *str)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen const char *p;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (*p == '\0')
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen switch (*p) {
d2b94d25f842cd1b7acaf4dd7de858f7c6a821c9Timo Sirainenstatic void solr_quote(string_t *dest, const char *str)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainenstatic void solr_quote_http(string_t *dest, const char *str)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen solr_connection_http_escape(solr_conn, dest, str);
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainenstatic void fts_solr_set_default_ns(struct solr_fts_backend *backend)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen struct mail_namespace *ns = backend->backend.ns;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT(ns->user);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const struct fts_solr_settings *set = &fuser->set;
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen const char *str;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_namespace_find_prefix(ns->user->namespaces,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_error("fts_solr: default_ns setting points to "
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "nonexistent namespace");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_namespace_find_inbox(ns->user->namespaces);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen while (backend->default_ns->alias_for != NULL)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen backend->default_ns = backend->default_ns->alias_for;
e54512a5189192fe72d1e2c53927c98c5ac920b4Timo Sirainenstatic void fts_box_name_get_root(struct mail_namespace **ns, const char **name)
const char *name;
i_unreached();
return name;
const char *str;
if (!neg)
if (!neg)
const char *box_name;
unsigned int count;
int ret = 0;
*last_uid_r = 0;
return ret;
static struct fts_backend_update_context *
if (uid != 0)
const char *box_name;
const char *str;
int ret;
return ret;
T_BEGIN {
} T_END;
i_unreached();
return TRUE;
case SEARCH_TEXT: {
case SEARCH_BODY:
return FALSE;
return TRUE;
bool and_args)
unsigned int last_len;
if (and_args)
return FALSE;
return TRUE;
const char *box_name;
int ret;
&status);
return ret;
const char *box_name;
char *box_id;
unsigned int i, len;
.flags = 0,
NULL,