fts-backend-solr.c revision 0fbe824cee2ee2f8fa0f27f4c0d4561a53b29fa8
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenstatic struct solr_connection *solr_conn = NULL;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic void solr_quote_str(string_t *dest, const char *str)
da7f1a07f583df8905684a7b78469960afd7c78dPhil Carmody solr_connection_quote_str(solr_conn, dest, str);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenxml_encode_data(string_t *dest, const unsigned char *data, unsigned int len)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen unsigned int i;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen for (i = 0; i < len; i++) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen switch (data[i]) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainenstatic void xml_encode(string_t *dest, const char *str)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen xml_encode_data(dest, (const unsigned char *)str, strlen(str));
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic struct fts_backend *
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenfts_backend_solr_init(struct mailbox *box ATTR_UNUSED)
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainen solr_conn = solr_connection_init(getenv("FTS_SOLR"));
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void fts_backend_solr_deinit(struct fts_backend *backend)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic int fts_backend_solr_get_last_uid(struct fts_backend *backend,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int count;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen str_append(str, "fl=uid&rows=1&sort=uid%20desc&q=");
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen mailbox_get_status(backend->box, STATUS_UIDVALIDITY, &status);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen str_printfa(str, "uidv:%u%%20box:", status.uidvalidity);
01c7ba8366ceafdbc0752d93079bbe785bebc9e1Timo Sirainen solr_quote_str(str, backend->box->storage->user);
556d69b89bf0afd1ba53acce4775097e494b6b8bMartti Rannanjärvi if (solr_connection_select(solr_conn, str_c(str), &uids) < 0)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* nothing indexed yet for this mailbox */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch } else if (count == 1 && uidvals[0].seq1 == uidvals[0].seq2) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_error("fts_solr: Last UID lookup returned multiple rows");
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainenfts_backend_solr_build_init(struct fts_backend *backend, uint32_t *last_uid_r,
383d0e8c24451468d6bea17e4b55d74de744abe6Timo Sirainen ctx = i_new(struct solr_fts_backend_build_context, 1);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen ctx->post = solr_connection_post_begin(solr_conn);
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen mailbox_get_status(backend->box, STATUS_UIDVALIDITY, &status);
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainenfts_backend_solr_build_more(struct fts_backend_build_context *_ctx,
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen (struct solr_fts_backend_build_context *)_ctx;
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen /* body comes first, then headers */
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen /* uid changed */
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen "<field name=\"uid\">%u</field>"
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen "<field name=\"uidv\">%u</field>",
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen str_append(cmd, "</field><field name=\"user\">");
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen str_printfa(cmd, "</field><field name=\"id\">%u/%u/",
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen solr_connection_post_more(ctx->post, str_data(cmd),
int ret = 0;
return ret;
T_BEGIN {
} T_END;