Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/fts-solr/fts-backend-solr.c @ 9292:96b764649cbb HEAD
fts: Fixed crashing with Squat.
A better solution would be for Squat to use existing mailboxes' Squat
indexes, but for now this isn't done.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 07 Aug 2009 15:12:04 -0400 |
parents | d21bd1a1710a |
children | 00cd9aacd03c |
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; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
21 char *id_username, *id_namespace, *id_box_name; |
8499
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 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
51 static void fts_box_name_get_root(struct mail_namespace **ns, const char **name) |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
52 { |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
53 struct mail_namespace *orig_ns = *ns; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
54 |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
55 while ((*ns)->alias_for != NULL) |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
56 *ns = (*ns)->alias_for; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
57 |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
58 if (**name == '\0' && *ns != orig_ns && |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
59 ((*ns)->flags & NAMESPACE_FLAG_INBOX) != 0) { |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
60 /* ugly workaround to allow selecting INBOX from a Maildir/ |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
61 when it's not in the inbox=yes namespace. */ |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
62 *name = "INBOX"; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
63 } |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
64 } |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
65 |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
66 static const char * |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
67 fts_box_get_root(struct mailbox *box, struct mail_namespace **ns_r) |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
68 { |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
69 struct mail_namespace *ns = box->storage->ns; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
70 const char *name = box->name; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
71 |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
72 fts_box_name_get_root(&ns, &name); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
73 *ns_r = ns; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
74 return name; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
75 } |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
76 |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
77 static void |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
78 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
|
79 { |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
80 unsigned int i; |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
81 |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
82 for (i = 0; i < len; i++) { |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
83 switch (data[i]) { |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 case '&': |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 str_append(dest, "&"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 break; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 case '<': |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 str_append(dest, "<"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 break; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 case '>': |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 str_append(dest, ">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 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
|
93 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
|
94 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
|
95 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
|
96 /* 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
|
97 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
|
98 break; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 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
|
100 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
|
101 /* 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
|
102 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
|
103 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
|
104 } 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
|
105 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
|
106 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 break; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
112 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
|
113 { |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
114 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
|
115 } |
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
116 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
117 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
|
118 { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
119 string_t *tmp; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
120 const char *p; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
121 |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
122 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
|
123 if (*p == '/' || *p == '!') |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
124 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
125 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
126 if (*p == '\0') |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
127 return str; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
128 |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
129 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
|
130 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
|
131 switch (*p) { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
132 case '/': |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
133 str_append(tmp, "!\\"); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
134 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
135 case '!': |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
136 str_append(tmp, "!!"); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
137 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
138 default: |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
139 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
|
140 break; |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
141 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
142 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
143 return str_c(tmp); |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
144 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
145 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
146 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
|
147 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
148 str_append_c(dest, '"'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
149 str_append(dest, str_escape(str)); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
150 str_append_c(dest, '"'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
151 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
152 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
153 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
|
154 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
155 str_append(dest, "%22"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
156 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
|
157 str_append(dest, "%22"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
158 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
159 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 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
|
161 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
|
162 { |
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
|
163 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
|
164 struct solr_fts_backend *backend; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
165 struct mail_namespace *ns; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
166 const char *str, *box_name; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
168 |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
169 box_name = fts_box_get_root(box, &ns); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
170 i_assert(*box_name != '\0'); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
171 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 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
|
174 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
175 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
|
176 str = fts_solr_settings.default_ns_prefix; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
177 if (str != NULL) { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
178 backend->default_ns = |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
179 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
|
180 if (backend->default_ns == NULL) { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
181 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
|
182 "nonexisting namespace"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
183 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
184 } else { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
185 backend->default_ns = |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
186 mail_namespace_find_inbox(ns->user->namespaces); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
187 } |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
188 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
|
189 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
|
190 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
191 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
|
192 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
|
193 if (ns != backend->default_ns) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
194 str = solr_escape_id_str(ns->prefix); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
195 backend->id_namespace = i_strdup(str); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
196 } |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
197 backend->id_box_name = i_strdup(box_name); |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
198 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
|
199 |
e814614ffb65
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
Timo Sirainen <tss@iki.fi>
parents:
8001
diff
changeset
|
200 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
|
201 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
|
202 return &backend->backend; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
205 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
|
206 { |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
207 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
|
208 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
209 i_free(backend->id_box_name); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
210 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
|
211 i_free(backend->id_username); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 i_free(backend); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
215 static void |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
216 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
|
217 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
|
218 { |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
219 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
|
220 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
221 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
|
222 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
|
223 |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
224 if (ns == backend->default_ns || *ns->prefix == '\0') { |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
225 if (!neg) |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
226 str_append(str, " -ns:[* TO *]"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
227 else |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
228 str_append(str, " +ns:[* TO *]"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
229 } else { |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
230 if (!neg) |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
231 str_append(str, " +ns:"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
232 else |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
233 str_append(str, " -ns:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
234 solr_quote(str, ns->prefix); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
235 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
236 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
237 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
238 static void |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
239 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
|
240 struct mail_namespace *ns) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
241 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
242 string_t *tmp; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
243 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
244 tmp = t_str_new(64); |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
245 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
|
246 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
|
247 } |
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
248 |
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
|
249 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
|
250 uint32_t *last_uid_r) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
252 struct mailbox *box = backend->box; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
253 struct mail_namespace *ns; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 ARRAY_TYPE(seq_range) uids; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 const struct seq_range *uidvals; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
257 const char *box_name; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 unsigned int count; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 string_t *str; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 str = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
262 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
|
263 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
264 box_name = fts_box_get_root(box, &ns); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
265 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
266 mailbox_get_status(box, STATUS_UIDVALIDITY, &status); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
267 str_printfa(str, "uidv:%u+box:", status.uidvalidity); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
268 solr_quote_http(str, box_name); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
269 solr_add_ns_query_http(str, backend, ns); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
270 str_append(str, "+user:"); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
271 solr_quote_http(str, ns->user->username); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 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
|
274 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
|
275 NULL, NULL, &uids, NULL) < 0) |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 return -1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 uidvals = array_get(&uids, &count); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 if (count == 0) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 /* nothing indexed yet for this mailbox */ |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 *last_uid_r = 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 } 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
|
283 *last_uid_r = uidvals[0].seq1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 } else { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 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
|
286 return -1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 return 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 |
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
|
291 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
|
292 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
|
293 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
294 struct mailbox *box = backend->box; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
295 struct mail_namespace *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
|
296 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
|
297 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
|
298 const struct seq_range *uidvals; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
299 const char *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
|
300 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
|
301 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
|
302 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
303 str = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
304 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
|
305 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
306 box_name = fts_box_get_root(box, &ns); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
307 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
308 mailbox_get_status(box, STATUS_UIDVALIDITY, &status); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
309 str_printfa(str, "uidv:%u+box:", status.uidvalidity); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
310 solr_quote_http(str, box_name); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
311 solr_add_ns_query_http(str, backend, ns); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
312 str_append(str, "+user:"); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
313 solr_quote_http(str, 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
|
314 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
315 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
|
316 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
|
317 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
|
318 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
|
319 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
320 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
|
321 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
|
322 /* 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
|
323 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
|
324 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
|
325 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
|
326 } 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
|
327 *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
|
328 } 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
|
329 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
|
330 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
|
331 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
332 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
|
333 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
334 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
339 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
|
340 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
|
341 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
342 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
|
343 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
|
344 else |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
345 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
|
346 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
347 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
348 static bool |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
349 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
|
350 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
|
351 { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
352 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
|
353 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
|
354 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
355 const char *vname; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
356 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
357 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
|
358 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
|
359 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
|
360 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
|
361 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
|
362 map->uidvalidity = uidvalidity; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
363 map->uid = *uid; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
364 } |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
365 return FALSE; |
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 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
368 static void |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
369 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
|
370 { |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
371 struct mail_namespace *ns = pattern->ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
372 const char *name, *p; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
373 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
374 name = pattern->pattern; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
375 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
|
376 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
|
377 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
378 fts_box_name_get_root(&ns, &name); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
379 |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
380 if (strcmp(name, "*") == 0) { |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
381 str_append(str, "[* TO *]"); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
382 return; |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
383 } |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
384 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
385 /* 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
|
386 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
|
387 if (*p == '%' || *p == '*') |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
388 break; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
389 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
390 if (*p == '\0') { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
391 /* full mailbox name */ |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
392 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
|
393 return; |
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 /* there are at least some wildcards. */ |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
397 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
|
398 if (*p == '%' || *p == '*') { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
399 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
|
400 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
|
401 } else { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
402 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
|
403 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
|
404 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
|
405 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
406 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
407 } |
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 static void |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
410 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
|
411 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
|
412 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
413 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
|
414 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
415 const struct mailbox_virtual_pattern *includes, *excludes; |
8519 | 416 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
|
417 string_t *fq; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
418 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
419 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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 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
|
425 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
426 /* 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
|
427 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
|
428 all mailboxes. */ |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
429 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
|
430 if (*includes[i].pattern == '*' || |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
431 *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
|
432 break; |
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 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
435 fq = t_str_new(128); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
436 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
|
437 /* 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
|
438 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
|
439 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
|
440 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
|
441 str_append(fq, " OR +"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
442 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
|
443 str_append(fq, "+box:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
444 solr_add_pattern(fq, &includes[i]); |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
445 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
|
446 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
|
447 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
448 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
|
449 } |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
450 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
|
451 for (i = 0; i < exc_count; i++) { |
8519 | 452 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
|
453 str_append_c(fq, ' '); |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
454 str_append(fq, "NOT ("); |
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
455 str_append(fq, "box:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
456 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
|
457 |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
458 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
|
459 ns = ns->alias_for; |
8945
43b68bd6023a
fts-solr: Fixes with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8879
diff
changeset
|
460 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
|
461 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
|
462 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
463 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
|
464 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
|
465 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
|
466 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
467 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
468 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
469 static int |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
470 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
|
471 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
|
472 { |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
473 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
|
474 string_t *str; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
475 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
476 memset(&ctx, 0, sizeof(ctx)); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
477 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
|
478 ctx.pool = pool; |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
479 ctx.last_uids = last_uids; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
480 ctx.box = backend->box; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
481 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
|
482 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
483 str = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
484 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
|
485 SOLR_MAX_ROWS); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
486 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
|
487 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
|
488 |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
489 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
|
490 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
|
491 NULL, NULL); |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
492 } |
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
493 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 static int |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 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
|
496 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
|
497 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 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
|
499 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 *last_uid_r = (uint32_t)-1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 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
|
504 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
|
505 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
|
506 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 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
|
508 ctx->uid_validity = status.uidvalidity; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
509 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
510 *ctx_r = &ctx->ctx; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 return 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 |
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
|
514 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
|
515 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
|
516 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
|
517 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
518 struct solr_fts_backend *backend = |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
519 (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
|
520 struct mailbox *box = ctx->ctx.backend->box; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
521 struct mail_namespace *ns; |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
522 const char *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
|
523 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
524 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
|
525 "<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
|
526 "<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
|
527 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
|
528 |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
529 box_name = fts_box_get_root(box, &ns); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
530 |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
531 if (ns != backend->default_ns) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
532 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
|
533 xml_encode(ctx->cmd, ns->prefix); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
534 str_append(ctx->cmd, "</field>"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
535 } |
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
|
536 str_append(ctx->cmd, "<field name=\"box\">"); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
537 xml_encode(ctx->cmd, 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
|
538 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
|
539 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
|
540 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
|
541 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
542 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
543 static void xml_encode_id(string_t *str, struct fts_backend *_backend, |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
544 uint32_t uid, uint32_t uid_validity) |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
545 { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
546 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
|
547 |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
548 if (uid != 0) |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
549 str_printfa(str, "%u/", uid); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
550 else |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
551 str_append(str, "L/"); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
552 if (backend->id_namespace != NULL) { |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
553 xml_encode(str, backend->id_namespace); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
554 str_append_c(str, '/'); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
555 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
556 str_printfa(str, "%u/", uid_validity); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
557 xml_encode(str, backend->id_username); |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
558 str_append_c(str, '/'); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
559 xml_encode(str, backend->id_box_name); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
560 } |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
561 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 static int |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 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
|
564 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
|
565 size_t size, bool headers) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 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
|
568 (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
|
569 string_t *cmd = ctx->cmd; |
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 /* body comes first, then headers */ |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 if (ctx->prev_uid != uid) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 /* uid changed */ |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
574 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
|
575 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
|
576 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
|
577 } else { |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 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
|
579 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 ctx->prev_uid = uid; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 |
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
|
582 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
|
583 str_printfa(cmd, "<field name=\"id\">"); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
584 xml_encode_id(cmd, _ctx->backend, uid, ctx->uid_validity); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 str_append(cmd, "</field>"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 ctx->headers = headers; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 if (headers) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 str_append(cmd, "<field name=\"hdr\">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 } else { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
591 str_append(cmd, "<field name=\"body\">"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
593 } else if (headers && !ctx->headers) { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
594 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
|
595 } else { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 i_assert(!(!headers && ctx->headers)); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 |
8000
61be6a4722c5
fts-solr: Encode entities when indexing data.
Timo Sirainen <tss@iki.fi>
parents:
7999
diff
changeset
|
599 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
|
600 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
|
601 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
|
602 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
|
603 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
|
604 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
605 return 0; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
606 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
607 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
608 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
|
609 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
|
610 { |
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; |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
612 |
8495
ffb37c392166
Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8493
diff
changeset
|
613 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
|
614 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
|
615 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
616 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
|
617 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
618 /* 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
|
619 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
|
620 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
|
621 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
|
622 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
|
623 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
|
624 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
|
625 "<field name=\"id\">"); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
626 xml_encode_id(ctx->cmd, ctx->ctx.backend, 0, ctx->uid_validity); |
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
|
627 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
|
628 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
629 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
|
630 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
|
631 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
|
632 /* 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
|
633 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
|
634 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
|
635 "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
|
636 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
|
637 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
|
638 } |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
639 |
ee1ecdda8a6b
fts-solr: Keep last_uid field updated containing the mailbox's last added UID.
Timo Sirainen <tss@iki.fi>
parents:
8484
diff
changeset
|
640 static int |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
641 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
|
642 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
643 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
|
644 (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
|
645 int ret; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
646 |
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
|
647 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
|
648 str_free(&ctx->cmd); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 i_free(ctx); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 return ret; |
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 |
8493
149c6ccc3df4
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
Timo Sirainen <tss@iki.fi>
parents:
8492
diff
changeset
|
654 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
|
655 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
656 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
657 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
658 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
|
659 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
660 T_BEGIN { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
661 string_t *cmd; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
662 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
663 cmd = t_str_new(256); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
664 str_append(cmd, "<delete><id>"); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
665 xml_encode_id(cmd, backend, mail->uid, status.uidvalidity); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
666 str_append(cmd, "</id></delete>"); |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
668 (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
|
669 } T_END; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
670 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
671 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
672 static void |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
673 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
|
674 struct mailbox *box ATTR_UNUSED, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
675 bool committed ATTR_UNUSED) |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
676 { |
8001
3fbfdda3e5d3
fts-solr: Send data to Solr in larger packets. Commit after expunges.
Timo Sirainen <tss@iki.fi>
parents:
8000
diff
changeset
|
677 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
|
678 "<commit waitFlush=\"false\" waitSearcher=\"false\"/>"); |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
680 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
681 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
|
682 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
683 return 1; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
684 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
685 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
686 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
|
687 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
688 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
689 |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
690 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
|
691 uint32_t uidvalidity, uint32_t *uid, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
692 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
|
693 { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
694 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
|
695 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
696 const char *vname; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
697 bool convert_inbox; |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
698 |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
699 ns = solr_get_namespaces(ctx->backend, ctx->box, ns_prefix); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
700 convert_inbox = (ns->flags & NAMESPACE_FLAG_INBOX) != 0 && |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
701 strcmp(mailbox, "INBOX") == 0; |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
702 for (; ns != NULL; ns = ns->alias_chain_next) { |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
703 vname = convert_inbox ? ns->prefix : |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
704 mail_namespace_get_vname(ns, ctx->vname, mailbox); |
8500
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
705 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
|
706 *uid, uid)) |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
707 return TRUE; |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
708 } |
3efcdc45d111
Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents:
8499
diff
changeset
|
709 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
|
710 } |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
711 |
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
|
712 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
|
713 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
|
714 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
|
715 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
|
716 { |
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
|
717 struct mailbox *box = ctx->backend->box; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
718 struct mail_namespace *ns; |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
719 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
|
720 const struct fts_backend_lookup_field *fields; |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
721 const char *box_name; |
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
|
722 unsigned int i, count; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
723 struct mailbox_status status; |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
724 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
|
725 bool virtual; |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
726 |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
727 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
|
728 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
|
729 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
730 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
|
731 if (!virtual) { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
732 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
|
733 status.uidnext); |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
734 } else { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
735 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
|
736 "&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
|
737 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
|
738 } |
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
|
739 |
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
|
740 /* 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
|
741 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
|
742 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
|
743 if (i > 0) |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
744 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
|
745 |
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
|
746 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
|
747 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
|
748 |
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
|
749 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
|
750 /* 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
|
751 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
|
752 str_append(str, "body:"); |
9141
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
753 solr_quote_http(str, fields[i].key); |
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
|
754 } 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
|
755 /* 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
|
756 str_append(str, "hdr:"); |
9141
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
757 solr_quote_http(str, fields[i].key); |
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
|
758 } 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
|
759 /* both */ |
9141
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
760 str_append(str, "(body:"); |
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
761 solr_quote_http(str, fields[i].key); |
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
762 str_append(str, "+OR+hdr:"); |
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
763 solr_quote_http(str, fields[i].key); |
d21bd1a1710a
solr: Don't use "any" copyfield, it doubles the index size.
Timo Sirainen <tss@iki.fi>
parents:
8950
diff
changeset
|
764 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
|
765 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
766 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
767 |
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 /* 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
|
769 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
|
770 str_append(str, "&fq=%2Buser:"); |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
771 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
|
772 if (virtual) |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
773 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
|
774 else { |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
775 box_name = fts_box_get_root(box, &ns); |
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
|
776 str_printfa(str, "+%%2Buidv:%u+%%2Bbox:", status.uidvalidity); |
8950
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
777 solr_quote_http(str, box_name); |
ec1ae90af21a
fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents:
8946
diff
changeset
|
778 solr_add_ns_query_http(str, ctx->backend, ns); |
8484
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
779 } |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
780 |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
781 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
|
782 if (!virtual) { |
db78eab2ba5d
Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8109
diff
changeset
|
783 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
|
784 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
|
785 } else { |
8499
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
786 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
|
787 uid_map_ctx.backend = ctx->backend; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
788 uid_map_ctx.box = box; |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
789 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
|
790 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
|
791 solr_virtual_uid_map, |
252b29ac5f43
fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8495
diff
changeset
|
792 &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
|
793 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
|
794 } |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
795 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
796 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
797 struct fts_backend fts_backend_solr = { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
798 MEMBER(name) "solr", |
9292
96b764649cbb
fts: Fixed crashing with Squat.
Timo Sirainen <tss@iki.fi>
parents:
9141
diff
changeset
|
799 MEMBER(flags) FTS_BACKEND_FLAG_VIRTUAL_LOOKUPS, |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
800 |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
801 { |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 fts_backend_solr_init, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
803 fts_backend_solr_deinit, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 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
|
805 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
|
806 fts_backend_solr_build_init, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
807 fts_backend_solr_build_more, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
808 fts_backend_solr_build_deinit, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
809 fts_backend_solr_expunge, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
810 fts_backend_solr_expunge_finish, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
811 fts_backend_solr_lock, |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
812 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
|
813 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
|
814 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
|
815 fts_backend_solr_lookup |
7990
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
816 } |
662172573fe1
Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
817 }; |