1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
#ifndef FTS_API_PRIVATE_H
#define FTS_API_PRIVATE_H
#include "unichar.h"
#include "fts-api.h"
struct mail_user;
struct mailbox_list;
#define MAILBOX_GUID_HEX_LENGTH (GUID_128_SIZE*2)
struct fts_backend_vfuncs {
struct fts_backend *(*alloc)(void);
int (*init)(struct fts_backend *backend, const char **error_r);
void (*deinit)(struct fts_backend *backend);
int (*get_last_uid)(struct fts_backend *backend, struct mailbox *box,
uint32_t *last_uid_r);
struct fts_backend_update_context *
(*update_init)(struct fts_backend *backend);
int (*update_deinit)(struct fts_backend_update_context *ctx);
void (*update_set_mailbox)(struct fts_backend_update_context *ctx,
struct mailbox *box);
void (*update_expunge)(struct fts_backend_update_context *ctx,
uint32_t uid);
/* Start a build for specified key */
bool (*update_set_build_key)(struct fts_backend_update_context *ctx,
const struct fts_backend_build_key *key);
/* Finish a build for specified key - guaranteed to be called */
void (*update_unset_build_key)(struct fts_backend_update_context *ctx);
/* Add data for current build key */
int (*update_build_more)(struct fts_backend_update_context *ctx,
const unsigned char *data, size_t size);
int (*refresh)(struct fts_backend *backend);
int (*rescan)(struct fts_backend *backend);
int (*optimize)(struct fts_backend *backend);
bool (*can_lookup)(struct fts_backend *backend,
const struct mail_search_arg *args);
int (*lookup)(struct fts_backend *backend, struct mailbox *box,
struct mail_search_arg *args, enum fts_lookup_flags flags,
struct fts_result *result);
int (*lookup_multi)(struct fts_backend *backend,
struct mailbox *const boxes[],
struct mail_search_arg *args,
enum fts_lookup_flags flags,
struct fts_multi_result *result);
void (*lookup_done)(struct fts_backend *backend);
};
enum fts_backend_flags {
/* Backend supports indexing binary MIME parts */
FTS_BACKEND_FLAG_BINARY_MIME_PARTS = 0x01,
/* Send built text to backend normalized rather than
preserving original case */
FTS_BACKEND_FLAG_NORMALIZE_INPUT = 0x02,
/* Send only fully indexable words rather than randomly sized blocks */
FTS_BACKEND_FLAG_BUILD_FULL_WORDS = 0x04,
/* Fuzzy search works */
FTS_BACKEND_FLAG_FUZZY_SEARCH = 0x08,
/* Tokenize all the input. update_build_more() will be called a single
directly indexable token at a time. Searching will modify the search
args so that lookup() sees only tokens that can be directly
searched. */
FTS_BACKEND_FLAG_TOKENIZED_INPUT = 0x10
};
struct fts_header_filters {
pool_t pool;
ARRAY_TYPE(const_string) includes;
ARRAY_TYPE(const_string) excludes;
bool loaded:1;
bool exclude_is_default:1;
};
struct fts_backend {
const char *name;
enum fts_backend_flags flags;
struct fts_backend_vfuncs v;
struct mail_namespace *ns;
struct fts_header_filters header_filters;
bool updating:1;
};
struct fts_backend_update_context {
struct fts_backend *backend;
normalizer_func_t *normalizer;
struct mailbox *cur_box, *backend_box;
bool build_key_open:1;
bool failed:1;
};
struct fts_index_header {
uint32_t last_indexed_uid;
/* Checksum of settings. If the settings change, the index should
be rebuilt. */
uint32_t settings_checksum;
uint32_t unused;
};
void fts_backend_register(const struct fts_backend *backend);
void fts_backend_unregister(const char *name);
bool fts_backend_default_can_lookup(struct fts_backend *backend,
const struct mail_search_arg *args);
void fts_filter_uids(ARRAY_TYPE(seq_range) *definite_dest,
const ARRAY_TYPE(seq_range) *definite_filter,
ARRAY_TYPE(seq_range) *maybe_dest,
const ARRAY_TYPE(seq_range) *maybe_filter);
/* Returns TRUE if ok, FALSE if no fts header */
bool fts_index_get_header(struct mailbox *box, struct fts_index_header *hdr_r);
int fts_index_set_header(struct mailbox *box,
const struct fts_index_header *hdr);
int ATTR_NOWARN_UNUSED_RESULT
fts_index_set_last_uid(struct mailbox *box, uint32_t last_uid);
int fts_backend_reset_last_uids(struct fts_backend *backend);
int fts_index_have_compatible_settings(struct mailbox_list *list,
uint32_t checksum);
/* Returns TRUE if FTS backend should index the header for optimizing
separate lookups */
bool fts_header_want_indexed(const char *hdr_name);
/* Returns TRUE if header's values should be considered to have a language. */
bool fts_header_has_language(const char *hdr_name);
int fts_mailbox_get_guid(struct mailbox *box, const char **guid_r);
#endif
|