Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/fts-solr/fts-backend-solr.c @ 8945:43b68bd6023a HEAD
fts-solr: Fixes with virtual mailboxes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 14 Apr 2009 16:51:36 -0400 |
parents | e81dfb69bfc5 |
children | 7e639229c2c8 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8519
diff
changeset
|
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */ |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
6 #include "strescape.h" |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-storage-private.h" |
8109
e7929190cd32
fts-solr: Fixed compiling with recent struct mail_user changes.
Timo Sirainen <tss@iki.fi>
parents:
8006
diff
changeset
|
8 #include "mail-namespace.h" |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "solr-connection.h" |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "fts-solr-plugin.h" |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
12 #include <ctype.h> |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
8001
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
14 #define SOLR_CMDBUF_SIZE (1024*64) |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
15 #define SOLR_MAX_ROWS 100000 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
16 #define FTS_SOLR_MAX_BOX_INC_PATTERNS 5 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
17 #define FTS_SOLR_MAX_BOX_EXC_PATTERNS 5 |
8001
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
18 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
19 struct solr_fts_backend { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
20 struct fts_backend backend; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
21 char *id_username, *id_namespace; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
22 struct mail_namespace *default_ns; |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
23 }; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
24 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct solr_fts_backend_build_context { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct fts_backend_build_context ctx; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct solr_connection_post *post; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 uint32_t prev_uid, uid_validity; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 string_t *cmd; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 bool headers; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 }; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
34 struct solr_virtual_uid_map_context { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
35 struct fts_backend *backend; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
36 struct mailbox *box; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
37 string_t *vname; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
38 }; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
39 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
40 struct fts_backend_solr_get_last_uids_context { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
41 struct fts_backend *backend; |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
42 pool_t pool; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
43 ARRAY_TYPE(fts_backend_uid_map) *last_uids; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
44 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
45 struct mailbox *box; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
46 string_t *vname; |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
47 }; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
48 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 static struct solr_connection *solr_conn = NULL; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
51 static void |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
52 xml_encode_data(string_t *dest, const unsigned char *data, unsigned int len) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 { |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
54 unsigned int i; |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
55 |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
56 for (i = 0; i < len; i++) { |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
57 switch (data[i]) { |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 case '&': |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 str_append(dest, "&"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 break; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 case '<': |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 str_append(dest, "<"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 break; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 case '>': |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 str_append(dest, ">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 break; |
8848
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
67 case '\t': |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
68 case '\n': |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
69 case '\r': |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
70 /* exceptions to the following control char check */ |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
71 str_append_c(dest, data[i]); |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
72 break; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 default: |
8848
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
74 if (data[i] < 32) { |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
75 /* SOLR doesn't like control characters. |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
76 replace them with spaces. */ |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
77 str_append_c(dest, ' '); |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
78 } else { |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
79 str_append_c(dest, data[i]); |
dd441977c578
fts-solr: Solr breaks when it sees control characters, so replace them with spaces.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
80 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 break; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
86 static void xml_encode(string_t *dest, const char *str) |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
87 { |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
88 xml_encode_data(dest, (const unsigned char *)str, strlen(str)); |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
89 } |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
90 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
91 static const char *solr_escape_id_str(const char *str) |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
92 { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
93 string_t *tmp; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
94 const char *p; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
95 |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
96 for (p = str; *p != '\0'; p++) { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
97 if (*p == '/' || *p == '!') |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
98 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
99 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
100 if (*p == '\0') |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
101 return str; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
102 |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
103 tmp = t_str_new(64); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
104 for (p = str; *p != '\0'; p++) { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
105 switch (*p) { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
106 case '/': |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
107 str_append(tmp, "!\\"); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
108 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
109 case '!': |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
110 str_append(tmp, "!!"); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
111 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
112 default: |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
113 str_append_c(tmp, *p); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
114 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
115 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
116 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
117 return str_c(tmp); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
118 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
119 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
120 static void solr_quote(string_t *dest, const char *str) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
121 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
122 str_append_c(dest, '"'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
123 str_append(dest, str_escape(str)); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
124 str_append_c(dest, '"'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
125 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
126 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
127 static void solr_quote_http(string_t *dest, const char *str) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
128 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
129 str_append(dest, "%22"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
130 solr_connection_http_escape(solr_conn, dest, str); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
131 str_append(dest, "%22"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
132 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
133 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 static struct fts_backend * |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
135 fts_backend_solr_init(struct mailbox *box) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 { |
8002
e814614ffb65
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
Timo Sirainen <tss@iki.fi>
parents:
8001
diff
changeset
|
137 const struct fts_solr_settings *set = &fts_solr_settings; |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
138 struct solr_fts_backend *backend; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
139 struct mail_namespace *ns = box->storage->ns; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
140 const char *str; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
142 while (ns->alias_for != NULL) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
143 ns = ns->alias_for; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
144 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 if (solr_conn == NULL) |
8002
e814614ffb65
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
Timo Sirainen <tss@iki.fi>
parents:
8001
diff
changeset
|
146 solr_conn = solr_connection_init(set->url, set->debug); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
148 backend = i_new(struct solr_fts_backend, 1); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
149 str = fts_solr_settings.default_ns_prefix; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
150 if (str != NULL) { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
151 backend->default_ns = |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
152 mail_namespace_find_prefix(ns->user->namespaces, str); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
153 if (backend->default_ns == NULL) { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
154 i_fatal("fts_solr: default_ns setting points to " |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
155 "nonexisting namespace"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
156 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
157 } else { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
158 backend->default_ns = |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
159 mail_namespace_find_inbox(ns->user->namespaces); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
160 } |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
161 while (backend->default_ns->alias_for != NULL) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
162 backend->default_ns = backend->default_ns->alias_for; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
163 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
164 str = solr_escape_id_str(ns->user->username); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
165 backend->id_username = i_strdup(str); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
166 if (ns != backend->default_ns) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
167 str = solr_escape_id_str(ns->prefix); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
168 backend->id_namespace = i_strdup(str); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
169 } |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
170 backend->backend = fts_backend_solr; |
8002
e814614ffb65
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
Timo Sirainen <tss@iki.fi>
parents:
8001
diff
changeset
|
171 |
e814614ffb65
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
Timo Sirainen <tss@iki.fi>
parents:
8001
diff
changeset
|
172 if (set->substring_search) |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
173 backend->backend.flags |= FTS_BACKEND_FLAG_SUBSTRING_LOOKUPS; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
174 return &backend->backend; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
177 static void fts_backend_solr_deinit(struct fts_backend *_backend) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 { |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
179 struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
180 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
181 i_free(backend->id_namespace); |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
182 i_free(backend->id_username); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 i_free(backend); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
186 static void |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
187 solr_add_ns_query(string_t *str, struct fts_backend *_backend, |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
188 struct mail_namespace *ns, bool neg) |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
189 { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
190 struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
191 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
192 while (ns->alias_for != NULL) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
193 ns = ns->alias_for; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
194 |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
195 if (ns == backend->default_ns || *ns->prefix == '\0') { |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
196 if (!neg) |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
197 str_append(str, " -ns:[* TO *]"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
198 else |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
199 str_append(str, " +ns:[* TO *]"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
200 } else { |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
201 if (!neg) |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
202 str_append(str, " +ns:"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
203 else |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
204 str_append(str, " -ns:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
205 solr_quote(str, ns->prefix); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
206 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
207 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
208 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
209 static void |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
210 solr_add_ns_query_http(string_t *str, struct fts_backend *backend, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
211 struct mail_namespace *ns) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
212 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
213 string_t *tmp; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
214 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
215 tmp = t_str_new(64); |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
216 solr_add_ns_query(tmp, backend, ns, FALSE); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
217 solr_connection_http_escape(solr_conn, str, str_c(tmp)); |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
218 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
219 |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
220 static int fts_backend_solr_get_last_uid_fallback(struct fts_backend *backend, |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
221 uint32_t *last_uid_r) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
223 struct mailbox *box = backend->box; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 ARRAY_TYPE(seq_range) uids; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 const struct seq_range *uidvals; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 unsigned int count; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 string_t *str; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 str = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
231 str_append(str, "fl=uid&rows=1&sort=uid+desc&q="); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
233 mailbox_get_status(box, STATUS_UIDVALIDITY, &status); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
234 str_printfa(str, "uidv:%u+box:", status.uidvalidity); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
235 solr_quote_http(str, box->name); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
236 solr_add_ns_query_http(str, backend, box->storage->ns); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
237 str_append(str, "+user:"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
238 solr_quote_http(str, box->storage->ns->user->username); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 t_array_init(&uids, 1); |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
241 if (solr_connection_select(solr_conn, str_c(str), |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
242 NULL, NULL, &uids, NULL) < 0) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 return -1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 uidvals = array_get(&uids, &count); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 if (count == 0) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 /* nothing indexed yet for this mailbox */ |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 *last_uid_r = 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 } else if (count == 1 && uidvals[0].seq1 == uidvals[0].seq2) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 *last_uid_r = uidvals[0].seq1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 } else { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 i_error("fts_solr: Last UID lookup returned multiple rows"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 return -1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 return 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
258 static int fts_backend_solr_get_last_uid(struct fts_backend *backend, |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
259 uint32_t *last_uid_r) |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
260 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
261 struct mailbox *box = backend->box; |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
262 struct mailbox_status status; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
263 ARRAY_TYPE(seq_range) uids; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
264 const struct seq_range *uidvals; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
265 unsigned int count; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
266 string_t *str; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
267 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
268 str = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
269 str_append(str, "fl=uid&rows=1&q=last_uid:TRUE+"); |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
270 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
271 mailbox_get_status(box, STATUS_UIDVALIDITY, &status); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
272 str_printfa(str, "uidv:%u+box:", status.uidvalidity); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
273 solr_quote_http(str, box->name); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
274 solr_add_ns_query_http(str, backend, box->storage->ns); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
275 str_append(str, "+user:"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
276 solr_quote_http(str, box->storage->ns->user->username); |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
277 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
278 t_array_init(&uids, 1); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
279 if (solr_connection_select(solr_conn, str_c(str), |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
280 NULL, NULL, &uids, NULL) < 0) |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
281 return -1; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
282 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
283 uidvals = array_get(&uids, &count); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
284 if (count == 0) { |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
285 /* either nothing is indexed or we're converting from an |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
286 older database format without the last_uid fields */ |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
287 return fts_backend_solr_get_last_uid_fallback(backend, |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
288 last_uid_r); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
289 } else if (count == 1 && uidvals[0].seq1 == uidvals[0].seq2) { |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
290 *last_uid_r = uidvals[0].seq1; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
291 } else { |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
292 i_error("fts_solr: Last UID lookup returned multiple rows"); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
293 return -1; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
294 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
295 return 0; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
296 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
297 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
298 static struct mail_namespace * |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
299 solr_get_namespaces(struct fts_backend *_backend, |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
300 struct mailbox *box, const char *ns_prefix) |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
301 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
302 struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
303 struct mail_namespace *namespaces = box->storage->ns->user->namespaces; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
304 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
305 if (ns_prefix == NULL) |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
306 return backend->default_ns; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
307 else |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
308 return mail_namespace_find_prefix(namespaces, ns_prefix); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
309 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
310 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
311 static bool |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
312 solr_virtual_get_last_uids(const char *ns_prefix, const char *mailbox, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
313 uint32_t uidvalidity, uint32_t *uid, void *context) |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
314 { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
315 struct fts_backend_solr_get_last_uids_context *ctx = context; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
316 struct fts_backend_uid_map *map; |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
317 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
318 const char *vname; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
319 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
320 ns = solr_get_namespaces(ctx->backend, ctx->box, ns_prefix); |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
321 for (; ns != NULL; ns = ns->alias_chain_next) { |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
322 vname = mail_namespace_get_vname(ns, ctx->vname, mailbox); |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
323 map = array_append_space(ctx->last_uids); |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
324 map->mailbox = p_strdup(ctx->pool, vname); |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
325 map->uidvalidity = uidvalidity; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
326 map->uid = *uid; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
327 } |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
328 return FALSE; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
329 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
330 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
331 static void |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
332 solr_add_pattern(string_t *str, const struct mailbox_virtual_pattern *pattern) |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
333 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
334 const char *name, *p; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
335 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
336 name = pattern->pattern; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
337 if (!mail_namespace_update_name(pattern->ns, &name)) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
338 name = mail_namespace_fix_sep(pattern->ns, name); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
339 |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
340 if (strcmp(name, "*") == 0) { |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
341 str_append(str, "[* TO *]"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
342 return; |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
343 } |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
344 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
345 /* first check if there are any wildcards in the pattern */ |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
346 for (p = name; *p != '\0'; p++) { |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
347 if (*p == '%' || *p == '*') |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
348 break; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
349 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
350 if (*p == '\0') { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
351 /* full mailbox name */ |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
352 solr_quote(str, name); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
353 return; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
354 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
355 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
356 /* there are at least some wildcards. */ |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
357 for (p = name; *p != '\0'; p++) { |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
358 if (*p == '%' || *p == '*') { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
359 if (p == name || (p[-1] != '%' && p[-1] != '*')) |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
360 str_append_c(str, '*'); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
361 } else { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
362 if (!i_isalnum(*p)) |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
363 str_append_c(str, '\\'); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
364 str_append_c(str, *p); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
365 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
366 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
367 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
368 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
369 static void |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
370 fts_backend_solr_filter_mailboxes(struct fts_backend *_backend, |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
371 string_t *str, struct mailbox *box) |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
372 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
373 struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
374 ARRAY_TYPE(mailbox_virtual_patterns) includes_arr, excludes_arr; |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
375 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
376 const struct mailbox_virtual_pattern *includes, *excludes; |
8519 | 377 unsigned int i, inc_count, exc_count; |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
378 string_t *fq; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
379 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
380 t_array_init(&includes_arr, 16); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
381 t_array_init(&excludes_arr, 16); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
382 mailbox_get_virtual_box_patterns(box, &includes_arr, &excludes_arr); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
383 includes = array_get(&includes_arr, &inc_count); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
384 excludes = array_get(&excludes_arr, &exc_count); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
385 i_assert(inc_count > 0); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
386 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
387 /* First see if there are any patterns that begin with a wildcard. |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
388 Solr doesn't allow them, so in that case we'll need to return |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
389 all mailboxes. */ |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
390 for (i = 0; i < inc_count; i++) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
391 if (*includes[i].pattern == '*' || |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
392 *includes[i].pattern == '%') |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
393 break; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
394 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
395 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
396 fq = t_str_new(128); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
397 if (i == inc_count && inc_count <= FTS_SOLR_MAX_BOX_INC_PATTERNS) { |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
398 /* we can filter what mailboxes we want returned */ |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
399 str_append_c(fq, '('); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
400 for (i = 0; i < inc_count; i++) { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
401 if (i != 0) |
8879
e81dfb69bfc5
fts-solr: Don't double-escape "+" if we're filtering what mailboxes we want.
Timo Sirainen <tss@iki.fi>
parents:
8848
diff
changeset
|
402 str_append(fq, " OR +"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
403 str_append_c(fq, '('); |
8879
e81dfb69bfc5
fts-solr: Don't double-escape "+" if we're filtering what mailboxes we want.
Timo Sirainen <tss@iki.fi>
parents:
8848
diff
changeset
|
404 str_append(fq, "+box:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
405 solr_add_pattern(fq, &includes[i]); |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
406 solr_add_ns_query(fq, _backend, includes[i].ns, FALSE); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
407 str_append_c(fq, ')'); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
408 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
409 str_append_c(fq, ')'); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
410 } |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
411 exc_count = I_MIN(FTS_SOLR_MAX_BOX_EXC_PATTERNS, exc_count); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
412 for (i = 0; i < exc_count; i++) { |
8519 | 413 if (str_len(fq) > 0) |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
414 str_append_c(fq, ' '); |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
415 str_append(fq, "NOT ("); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
416 str_append(fq, "box:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
417 solr_add_pattern(fq, &excludes[i]); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
418 |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
419 for (ns = excludes[i].ns; ns->alias_for != NULL; ) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
420 ns = ns->alias_for; |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
421 solr_add_ns_query(fq, _backend, ns, FALSE); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
422 str_append_c(fq, ')'); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
423 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
424 if (str_len(fq) > 0) { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
425 str_append(str, "&fq="); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
426 solr_connection_http_escape(solr_conn, str, str_c(fq)); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
427 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
428 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
429 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
430 static int |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
431 fts_backend_solr_get_all_last_uids(struct fts_backend *backend, pool_t pool, |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
432 ARRAY_TYPE(fts_backend_uid_map) *last_uids) |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
433 { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
434 struct fts_backend_solr_get_last_uids_context ctx; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
435 string_t *str; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
436 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
437 memset(&ctx, 0, sizeof(ctx)); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
438 ctx.backend = backend; |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
439 ctx.pool = pool; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
440 ctx.last_uids = last_uids; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
441 ctx.box = backend->box; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
442 ctx.vname = t_str_new(256); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
443 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
444 str = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
445 str_printfa(str, "fl=uid,box,uidv,ns&rows=%u&q=last_uid:TRUE+user:", |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
446 SOLR_MAX_ROWS); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
447 solr_quote_http(str, backend->box->storage->ns->user->username); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
448 fts_backend_solr_filter_mailboxes(backend, str, backend->box); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
449 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
450 return solr_connection_select(solr_conn, str_c(str), |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
451 solr_virtual_get_last_uids, &ctx, |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
452 NULL, NULL); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
453 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
454 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 static int |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 fts_backend_solr_build_init(struct fts_backend *backend, uint32_t *last_uid_r, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 struct fts_backend_build_context **ctx_r) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 struct solr_fts_backend_build_context *ctx; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 *last_uid_r = (uint32_t)-1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 ctx = i_new(struct solr_fts_backend_build_context, 1); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 ctx->ctx.backend = backend; |
8001
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
466 ctx->cmd = str_new(default_pool, SOLR_CMDBUF_SIZE); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 mailbox_get_status(backend->box, STATUS_UIDVALIDITY, &status); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 ctx->uid_validity = status.uidvalidity; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 *ctx_r = &ctx->ctx; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 return 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
475 static void |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
476 fts_backend_solr_add_doc_prefix(struct solr_fts_backend_build_context *ctx, |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
477 uint32_t uid) |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
478 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
479 struct solr_fts_backend *backend = |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
480 (struct solr_fts_backend *)ctx->ctx.backend; |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
481 struct mailbox *box = ctx->ctx.backend->box; |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
482 struct mail_namespace *ns = box->storage->ns; |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
483 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
484 str_printfa(ctx->cmd, "<doc>" |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
485 "<field name=\"uid\">%u</field>" |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
486 "<field name=\"uidv\">%u</field>", |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
487 uid, ctx->uid_validity); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
488 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
489 while (ns->alias_for != NULL) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
490 ns = ns->alias_for; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
491 |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
492 if (ns != backend->default_ns) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
493 str_append(ctx->cmd, "<field name=\"ns\">"); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
494 xml_encode(ctx->cmd, ns->prefix); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
495 str_append(ctx->cmd, "</field>"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
496 } |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
497 str_append(ctx->cmd, "<field name=\"box\">"); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
498 xml_encode(ctx->cmd, box->name); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
499 str_append(ctx->cmd, "</field><field name=\"user\">"); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
500 xml_encode(ctx->cmd, ns->user->username); |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
501 str_append(ctx->cmd, "</field>"); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
502 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
503 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
504 static void xml_encode_id(string_t *str, struct fts_backend *_backend, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
505 uint32_t uid, uint32_t uid_validity, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
506 const char *mailbox) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
507 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
508 struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
509 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
510 if (uid != 0) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
511 str_printfa(str, "%u/", uid); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
512 else |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
513 str_append(str, "L/"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
514 if (backend->id_namespace != NULL) { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
515 xml_encode(str, backend->id_namespace); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
516 str_append_c(str, '/'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
517 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
518 str_printfa(str, "%u/", uid_validity); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
519 xml_encode(str, backend->id_username); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
520 str_append_c(str, '/'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
521 xml_encode(str, mailbox); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
522 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
523 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 static int |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 fts_backend_solr_build_more(struct fts_backend_build_context *_ctx, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 uint32_t uid, const unsigned char *data, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 size_t size, bool headers) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 struct solr_fts_backend_build_context *ctx = |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
530 (struct solr_fts_backend_build_context *)_ctx; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 struct mailbox *box = _ctx->backend->box; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 string_t *cmd = ctx->cmd; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 /* body comes first, then headers */ |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 if (ctx->prev_uid != uid) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 /* uid changed */ |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
537 if (ctx->post == NULL) { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
538 ctx->post = solr_connection_post_begin(solr_conn); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 str_append(cmd, "<add>"); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
540 } else { |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 str_append(cmd, "</field></doc>"); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
542 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 ctx->prev_uid = uid; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
544 |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
545 fts_backend_solr_add_doc_prefix(ctx, uid); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
546 str_printfa(cmd, "<field name=\"id\">"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
547 xml_encode_id(cmd, _ctx->backend, uid, ctx->uid_validity, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
548 box->name); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 str_append(cmd, "</field>"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 ctx->headers = headers; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 if (headers) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
553 str_append(cmd, "<field name=\"hdr\">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 } else { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 str_append(cmd, "<field name=\"body\">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
557 } else if (headers && !ctx->headers) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 str_append(cmd, "</field><field name=\"hdr\">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 } else { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 i_assert(!(!headers && ctx->headers)); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
563 xml_encode_data(cmd, data, size); |
8001
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
564 if (str_len(cmd) > SOLR_CMDBUF_SIZE-128) { |
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
565 solr_connection_post_more(ctx->post, str_data(cmd), |
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
566 str_len(cmd)); |
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
567 str_truncate(cmd, 0); |
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
568 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 return 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 static int |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
573 fts_backed_solr_build_commit(struct solr_fts_backend_build_context *ctx) |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
574 { |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
575 struct mailbox *box = ctx->ctx.backend->box; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
576 int ret; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
577 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
578 if (ctx->post == NULL) |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
579 return 0; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
580 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
581 str_append(ctx->cmd, "</field></doc>"); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
582 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
583 /* Update the mailbox's last_uid field, replacing the existing |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
584 document. Note that since there is no locking, it's possible that |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
585 if another session is indexing at the same time, the last_uid value |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
586 may shrink. This doesn't really matter, we'll simply do more work |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
587 in future by reindexing some messages. */ |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
588 fts_backend_solr_add_doc_prefix(ctx, ctx->prev_uid); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
589 str_printfa(ctx->cmd, "<field name=\"last_uid\">TRUE</field>" |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
590 "<field name=\"id\">"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
591 xml_encode_id(ctx->cmd, ctx->ctx.backend, 0, ctx->uid_validity, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
592 box->name); |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
593 str_append(ctx->cmd, "</field></doc></add>"); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
594 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
595 solr_connection_post_more(ctx->post, str_data(ctx->cmd), |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
596 str_len(ctx->cmd)); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
597 ret = solr_connection_post_end(ctx->post); |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
598 /* commit and wait until the documents we just indexed are |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
599 visible to the following search */ |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
600 if (solr_connection_post(solr_conn, "<commit waitFlush=\"false\" " |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
601 "waitSearcher=\"true\"/>") < 0) |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
602 ret = -1; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
603 return ret; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
604 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
605 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
606 static int |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
607 fts_backend_solr_build_deinit(struct fts_backend_build_context *_ctx) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
608 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
609 struct solr_fts_backend_build_context *ctx = |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
610 (struct solr_fts_backend_build_context *)_ctx; |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
611 int ret; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
612 |
8492
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
613 ret = fts_backed_solr_build_commit(ctx); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
614 str_free(&ctx->cmd); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
615 i_free(ctx); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
616 return ret; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
617 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 static void |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
620 fts_backend_solr_expunge(struct fts_backend *backend, struct mail *mail) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
621 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 mailbox_get_status(mail->box, STATUS_UIDVALIDITY, &status); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 T_BEGIN { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 string_t *cmd; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 cmd = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
630 str_append(cmd, "<delete><id>"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
631 xml_encode_id(cmd, backend, mail->uid, status.uidvalidity, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
632 mail->box->name); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 str_append(cmd, "</id></delete>"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 (void)solr_connection_post(solr_conn, str_c(cmd)); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 } T_END; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
637 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
638 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
639 static void |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
640 fts_backend_solr_expunge_finish(struct fts_backend *backend ATTR_UNUSED, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
641 struct mailbox *box ATTR_UNUSED, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
642 bool committed ATTR_UNUSED) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
643 { |
8001
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
644 solr_connection_post(solr_conn, |
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
645 "<commit waitFlush=\"false\" waitSearcher=\"false\"/>"); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
646 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
647 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 static int fts_backend_solr_lock(struct fts_backend *backend ATTR_UNUSED) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 return 1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
651 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
652 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
653 static void fts_backend_solr_unlock(struct fts_backend *backend ATTR_UNUSED) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
655 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
656 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
657 static bool solr_virtual_uid_map(const char *ns_prefix, const char *mailbox, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
658 uint32_t uidvalidity, uint32_t *uid, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
659 void *context) |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
660 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
661 struct solr_virtual_uid_map_context *ctx = context; |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
662 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
663 const char *vname; |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
664 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
665 ns = solr_get_namespaces(ctx->backend, ctx->box, ns_prefix); |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
666 for (; ns != NULL; ns = ns->alias_chain_next) { |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
667 vname = mail_namespace_get_vname(ns, ctx->vname, mailbox); |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
668 if (mailbox_get_virtual_uid(ctx->box, vname, uidvalidity, |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
669 *uid, uid)) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
670 return TRUE; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
671 } |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
672 return FALSE; |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
673 } |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
674 |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
675 static int fts_backend_solr_lookup(struct fts_backend_lookup_context *ctx, |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
676 ARRAY_TYPE(seq_range) *definite_uids, |
8006
0a3b5ddb0869
Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents:
8004
diff
changeset
|
677 ARRAY_TYPE(seq_range) *maybe_uids, |
0a3b5ddb0869
Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents:
8004
diff
changeset
|
678 ARRAY_TYPE(fts_score_map) *scores) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 { |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
680 struct mailbox *box = ctx->backend->box; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
681 struct solr_virtual_uid_map_context uid_map_ctx; |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
682 const struct fts_backend_lookup_field *fields; |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
683 unsigned int i, count; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
684 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
685 string_t *str; |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
686 bool virtual; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
687 |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
688 virtual = strcmp(box->storage->name, "virtual") == 0; |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
689 mailbox_get_status(box, STATUS_UIDVALIDITY, &status); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
690 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
691 str = t_str_new(256); |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
692 if (!virtual) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
693 str_printfa(str, "fl=uid,score&rows=%u&sort=uid+asc&q=", |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
694 status.uidnext); |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
695 } else { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
696 str_printfa(str, "fl=uid,score,box,uidv,ns&rows=%u" |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
697 "&sort=box+asc,uid+asc&q=", |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
698 SOLR_MAX_ROWS); |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
699 } |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
700 |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
701 /* build a lucene search query from the fields */ |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
702 fields = array_get(&ctx->fields, &count); |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
703 for (i = 0; i < count; i++) { |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
704 if (i > 0) |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
705 str_append_c(str, '+'); |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
706 |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
707 if ((fields[i].flags & FTS_LOOKUP_FLAG_INVERT) != 0) |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
708 str_append_c(str, '-'); |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
709 |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
710 if ((fields[i].flags & FTS_LOOKUP_FLAG_HEADER) == 0) { |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
711 /* body only */ |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
712 i_assert((fields[i].flags & FTS_LOOKUP_FLAG_BODY) != 0); |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
713 str_append(str, "body:"); |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
714 } else if ((fields[i].flags & FTS_LOOKUP_FLAG_BODY) == 0) { |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
715 /* header only */ |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
716 str_append(str, "hdr:"); |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
717 } else { |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
718 /* both */ |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
719 str_append(str, "any:"); |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
720 } |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
721 solr_quote_http(str, fields[i].key); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
722 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
723 |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
724 /* use a separate filter query for selecting the mailbox. it shouldn't |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
725 affect the score and there could be some caching benefits too. */ |
8505
5cc1c4f3d38b
fts-solr: In filter queries use "+" prefixes to require all the parameters to match.
Timo Sirainen <tss@iki.fi>
parents:
8500
diff
changeset
|
726 str_append(str, "&fq=%2Buser:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
727 solr_quote_http(str, box->storage->ns->user->username); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
728 if (virtual) |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
729 fts_backend_solr_filter_mailboxes(ctx->backend, str, box); |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
730 else { |
8505
5cc1c4f3d38b
fts-solr: In filter queries use "+" prefixes to require all the parameters to match.
Timo Sirainen <tss@iki.fi>
parents:
8500
diff
changeset
|
731 str_printfa(str, "+%%2Buidv:%u+%%2Bbox:", status.uidvalidity); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
732 solr_quote_http(str, box->name); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
733 solr_add_ns_query_http(str, ctx->backend, box->storage->ns); |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
734 } |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
735 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
736 array_clear(maybe_uids); |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
737 if (!virtual) { |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
738 return solr_connection_select(solr_conn, str_c(str), NULL, NULL, |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
739 definite_uids, scores); |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
740 } else { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
741 memset(&uid_map_ctx, 0, sizeof(uid_map_ctx)); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
742 uid_map_ctx.backend = ctx->backend; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
743 uid_map_ctx.box = box; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
744 uid_map_ctx.vname = t_str_new(256); |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
745 return solr_connection_select(solr_conn, str_c(str), |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
746 solr_virtual_uid_map, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
747 &uid_map_ctx, |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
748 definite_uids, scores); |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
749 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
750 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
751 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
752 struct fts_backend fts_backend_solr = { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
753 MEMBER(name) "solr", |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
754 MEMBER(flags) 0, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
756 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
757 fts_backend_solr_init, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 fts_backend_solr_deinit, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
759 fts_backend_solr_get_last_uid, |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
760 fts_backend_solr_get_all_last_uids, |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
761 fts_backend_solr_build_init, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
762 fts_backend_solr_build_more, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
763 fts_backend_solr_build_deinit, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
764 fts_backend_solr_expunge, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 fts_backend_solr_expunge_finish, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
766 fts_backend_solr_lock, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
767 fts_backend_solr_unlock, |
8004
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
768 NULL, |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
769 NULL, |
6418d4c0ff16
fts: Added a new lookup API where the backend can look up all the fields
Timo Sirainen <tss@iki.fi>
parents:
8002
diff
changeset
|
770 fts_backend_solr_lookup |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
771 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 }; |