index_storage_get_uid_range,
index_storage_get_expunges,
NULL,
- NULL,
- NULL,
- NULL,
index_mail_alloc,
index_header_lookup_init,
index_header_lookup_deinit,
index_storage_get_uid_range,
index_storage_get_expunges,
NULL,
- NULL,
- NULL,
- NULL,
dbox_mail_alloc,
index_header_lookup_init,
index_header_lookup_deinit,
index_storage_get_uid_range,
index_storage_get_expunges,
NULL,
- NULL,
- NULL,
- NULL,
dbox_mail_alloc,
index_header_lookup_init,
index_header_lookup_deinit,
index_storage_get_seq_range,
index_storage_get_uid_range,
index_storage_get_expunges,
- NULL,
- NULL,
- NULL,
maildir_get_private_flags_mask,
index_mail_alloc,
index_header_lookup_init,
index_storage_get_uid_range,
index_storage_get_expunges,
NULL,
- NULL,
- NULL,
- NULL,
index_mail_alloc,
index_header_lookup_init,
index_header_lookup_deinit,
index_storage_get_uid_range,
index_storage_get_expunges,
NULL,
- NULL,
- NULL,
- NULL,
index_mail_alloc,
index_header_lookup_init,
index_header_lookup_deinit,
bool (*get_expunges)(struct mailbox *box, uint64_t prev_modseq,
const ARRAY_TYPE(seq_range) *uids_filter,
ARRAY_TYPE(mailbox_expunge_rec) *expunges);
- bool (*get_virtual_uid)(struct mailbox *box,
- const char *backend_mailbox,
- uint32_t backend_uidvalidity,
- uint32_t backend_uid, uint32_t *uid_r);
- void (*get_virtual_backend_boxes)(struct mailbox *box,
- ARRAY_TYPE(mailboxes) *mailboxes,
- bool only_with_msgs);
- void (*get_virtual_box_patterns)(struct mailbox *box,
- ARRAY_TYPE(mailbox_virtual_patterns) *includes,
- ARRAY_TYPE(mailbox_virtual_patterns) *excludes);
enum mail_flags (*get_private_flags_mask)(struct mailbox *box);
struct mail *
uids_filter, expunges);
}
-bool mailbox_get_virtual_uid(struct mailbox *box, const char *backend_mailbox,
- uint32_t backend_uidvalidity,
- uint32_t backend_uid, uint32_t *uid_r)
-{
- if (box->v.get_virtual_uid == NULL)
- return FALSE;
- return box->v.get_virtual_uid(box, backend_mailbox, backend_uidvalidity,
- backend_uid, uid_r);
-}
-
-void mailbox_get_virtual_backend_boxes(struct mailbox *box,
- ARRAY_TYPE(mailboxes) *mailboxes,
- bool only_with_msgs)
-{
- if (box->v.get_virtual_backend_boxes == NULL)
- array_append(mailboxes, &box, 1);
- else
- box->v.get_virtual_backend_boxes(box, mailboxes, only_with_msgs);
-}
-
-void mailbox_get_virtual_box_patterns(struct mailbox *box,
- ARRAY_TYPE(mailbox_virtual_patterns) *includes,
- ARRAY_TYPE(mailbox_virtual_patterns) *excludes)
-{
- if (box->v.get_virtual_box_patterns == NULL) {
- struct mailbox_virtual_pattern pat;
-
- memset(&pat, 0, sizeof(pat));
- pat.ns = box->list->ns;
- pat.pattern = box->name;
- array_append(includes, &pat, 1);
- } else {
- box->v.get_virtual_box_patterns(box, includes, excludes);
- }
-}
-
struct mailbox_header_lookup_ctx *
mailbox_header_lookup_init(struct mailbox *box, const char *const headers[])
{
bool mailbox_get_expunges(struct mailbox *box, uint64_t prev_modseq,
const ARRAY_TYPE(seq_range) *uids_filter,
ARRAY_TYPE(mailbox_expunge_rec) *expunges);
-/* If box is a virtual mailbox, look up UID for the given backend message.
- Returns TRUE if found, FALSE if not. */
-bool mailbox_get_virtual_uid(struct mailbox *box, const char *backend_mailbox,
- uint32_t backend_uidvalidity,
- uint32_t backend_uid, uint32_t *uid_r);
-/* If box is a virtual mailbox, return all backend mailboxes. If
- only_with_msgs=TRUE, return only those mailboxes that have at least one
- message existing in the virtual mailbox. */
-void mailbox_get_virtual_backend_boxes(struct mailbox *box,
- ARRAY_TYPE(mailboxes) *mailboxes,
- bool only_with_msgs);
-/* If mailbox is a virtual mailbox, return all mailbox list patterns that
- are used to figure out which mailboxes belong to the virtual mailbox. */
-void mailbox_get_virtual_box_patterns(struct mailbox *box,
- ARRAY_TYPE(mailbox_virtual_patterns) *includes,
- ARRAY_TYPE(mailbox_virtual_patterns) *excludes);
/* Initialize new search request. charset specifies the character set used in
the search argument strings. If sort_program is non-NULL, the messages are
test_mailbox_get_uid_range,
test_mailbox_get_expunged_uids,
NULL,
- NULL,
- NULL,
- NULL,
test_mailbox_mail_alloc,
test_mailbox_header_lookup_init,
test_mailbox_header_lookup_deinit,
#include "unichar.h"
#include "mail-storage-private.h"
#include "mail-namespace.h"
+#include "fts-mailbox.h"
#include "solr-connection.h"
#include "fts-solr-plugin.h"
t_array_init(&includes_arr, 16);
t_array_init(&excludes_arr, 16);
- mailbox_get_virtual_box_patterns(box, &includes_arr, &excludes_arr);
+ fts_mailbox_get_virtual_box_patterns(box, &includes_arr, &excludes_arr);
includes = array_get(&includes_arr, &inc_count);
excludes = array_get(&excludes_arr, &exc_count);
i_assert(inc_count > 0);
for (; ns != NULL; ns = ns->alias_chain_next) {
vname = convert_inbox ? ns->prefix :
mail_namespace_get_vname(ns, ctx->vname, mailbox);
- if (mailbox_get_virtual_uid(ctx->box, vname, uidvalidity,
- *uid, uid))
+ if (fts_mailbox_get_virtual_uid(ctx->box, vname, uidvalidity,
+ *uid, uid))
return TRUE;
}
return FALSE;
-I$(top_srcdir)/src/lib-charset \
-I$(top_srcdir)/src/lib-mail \
-I$(top_srcdir)/src/lib-index \
- -I$(top_srcdir)/src/lib-storage
+ -I$(top_srcdir)/src/lib-storage \
+ -I$(top_srcdir)/src/lib-storage/index
lib20_fts_plugin_la_LDFLAGS = -module -avoid-version
lib20_fts_plugin_la_SOURCES = \
fts-api.c \
+ fts-mailbox.c \
fts-plugin.c \
fts-search.c \
fts-storage.c
noinst_HEADERS = \
fts-api.h \
fts-api-private.h \
+ fts-mailbox.h \
fts-plugin.h \
fts-storage.h
#include "mail-search-build.h"
#include "mail-storage-private.h"
#include "fts-api-private.h"
+#include "fts-mailbox.h"
#include "fts-storage.h"
#include "fts-plugin.h"
int ret;
t_array_init(&mailboxes, 64);
- mailbox_get_virtual_backend_boxes(fctx->t->box, &mailboxes, TRUE);
+ fts_mailbox_get_virtual_backend_boxes(fctx->t->box, &mailboxes, TRUE);
boxes = array_get_modifiable(&mailboxes, &box_count);
vctx->pool = pool_alloconly_create("fts virtual build", 1024);
extern struct mail_storage virtual_storage;
extern struct mailbox virtual_mailbox;
+extern struct virtual_mailbox_vfuncs virtual_mailbox_vfuncs;
struct virtual_storage_module virtual_storage_module =
MODULE_CONTEXT_INIT(&mail_storage_module_register);
mbox->box.storage = _storage;
mbox->box.list = list;
mbox->box.mail_vfuncs = &virtual_mail_vfuncs;
+ mbox->vfuncs = virtual_mailbox_vfuncs;
index_storage_mailbox_alloc(&mbox->box, name, flags,
VIRTUAL_INDEX_PREFIX);
index_storage_get_seq_range,
index_storage_get_uid_range,
index_storage_get_expunges,
- virtual_get_virtual_uid,
- virtual_get_virtual_backend_boxes,
- virtual_get_virtual_box_patterns,
NULL,
virtual_mail_alloc,
index_header_lookup_init,
virtual_is_inconsistent
}
};
+
+struct virtual_mailbox_vfuncs virtual_mailbox_vfuncs = {
+ virtual_get_virtual_uid,
+ virtual_get_virtual_backend_boxes,
+ virtual_get_virtual_box_patterns
+};
};
ARRAY_DEFINE_TYPE(virtual_backend_box, struct virtual_backend_box *);
+struct virtual_mailbox_vfuncs {
+ bool (*get_virtual_uid)(struct mailbox *box,
+ const char *backend_mailbox,
+ uint32_t backend_uidvalidity,
+ uint32_t backend_uid, uint32_t *uid_r);
+ void (*get_virtual_backend_boxes)(struct mailbox *box,
+ ARRAY_TYPE(mailboxes) *mailboxes,
+ bool only_with_msgs);
+ void (*get_virtual_box_patterns)(struct mailbox *box,
+ ARRAY_TYPE(mailbox_virtual_patterns) *includes,
+ ARRAY_TYPE(mailbox_virtual_patterns) *excludes);
+};
+
struct virtual_mailbox {
struct mailbox box;
struct virtual_storage *storage;
ARRAY_TYPE(mailbox_virtual_patterns) list_include_patterns;
ARRAY_TYPE(mailbox_virtual_patterns) list_exclude_patterns;
+ struct virtual_mailbox_vfuncs vfuncs;
+
unsigned int uids_mapped:1;
unsigned int sync_initialized:1;
unsigned int inconsistent:1;