This allows implementing other virtual storage backends.
const char *content_type, *content_disposition;
};
+struct virtual_mailbox_vfuncs {
+ /* convert backend UIDs to virtual UIDs. if some backend UID doesn't
+ exist in mailbox, it's simply ignored */
+ void (*get_virtual_uids)(struct mailbox *box,
+ struct mailbox *backend_mailbox,
+ const ARRAY_TYPE(seq_range) *backend_uids,
+ ARRAY_TYPE(seq_range) *virtual_uids_r);
+ /* like get_virtual_uids(), but if a backend UID doesn't exist,
+ convert it to 0. */
+ void (*get_virtual_uid_map)(struct mailbox *box,
+ struct mailbox *backend_mailbox,
+ const ARRAY_TYPE(seq_range) *backend_uids,
+ ARRAY_TYPE(uint32_t) *virtual_uids_r);
+ void (*get_virtual_backend_boxes)(struct mailbox *box,
+ ARRAY_TYPE(mailboxes) *mailboxes,
+ bool only_with_msgs);
+};
+
struct mailbox_vfuncs {
bool (*is_readonly)(struct mailbox *box);
struct mail_storage *storage;
struct mailbox_list *list;
- struct mailbox_vfuncs v, *vlast;
+ struct mailbox_vfuncs v, *vlast;
+ /* virtual mailboxes: */
+ const struct virtual_mailbox_vfuncs *virtual_vfuncs;
/* private: */
pool_t pool, metadata_pool;
/* Linked list of all mailboxes in this storage */
#include "mail-storage-private.h"
#include "mailbox-list-iter.h"
#include "mail-search.h"
-#include "../virtual/virtual-storage.h"
#include "fts-api-private.h"
static ARRAY(const struct fts_backend *) backends;
{
struct fts_index_header hdr;
- if (strcmp(box->storage->name, VIRTUAL_STORAGE_NAME) == 0) {
+ if (box->virtual_vfuncs != NULL) {
/* virtual mailboxes themselves don't have any indexes,
so catch this call here */
if (!fts_index_get_header(box, &hdr))
int fts_backend_rescan(struct fts_backend *backend)
{
- if (strcmp(backend->ns->storage->name, VIRTUAL_STORAGE_NAME) == 0) {
+ struct mailbox *box;
+ bool virtual_storage;
+
+ box = mailbox_alloc(backend->ns->list, "", 0);
+ virtual_storage = box->virtual_vfuncs != NULL;
+ mailbox_free(&box);
+
+ if (virtual_storage) {
/* just reset the last-uids for a virtual storage. */
return fts_backend_reset_last_uids(backend);
}
#include "str.h"
#include "seq-range-array.h"
#include "mail-search.h"
-#include "../virtual/virtual-storage.h"
#include "fts-api-private.h"
#include "fts-search-args.h"
#include "fts-search-serialize.h"
}
static void
-level_scores_add_vuids(struct virtual_mailbox *vbox,
+level_scores_add_vuids(struct mailbox *box,
struct fts_search_level *level, struct fts_result *br)
{
const struct fts_score_map *scores;
t_array_init(&backend_uids, 64);
for (i = 0; i < count; i++)
seq_range_array_add(&backend_uids, scores[i].uid);
- vbox->vfuncs.get_virtual_uid_map(&vbox->box, br->box,
- &backend_uids, &vuids_arr);
+ box->virtual_vfuncs->get_virtual_uid_map(box, br->box,
+ &backend_uids, &vuids_arr);
i_assert(array_count(&vuids_arr) == array_count(&br->scores));
vuids = array_get(&vuids_arr, &count);
struct mail_search_arg *args,
struct fts_multi_result *result)
{
- struct virtual_mailbox *vbox = (struct virtual_mailbox *)fctx->box;
ARRAY_TYPE(seq_range) vuids;
size_t orig_size;
unsigned int i;
array_clear(&vuids);
if (array_is_created(&br->definite_uids)) {
- vbox->vfuncs.get_virtual_uids(fctx->box, br->box,
- &br->definite_uids,
- &vuids);
+ fctx->box->virtual_vfuncs->get_virtual_uids(fctx->box,
+ br->box, &br->definite_uids, &vuids);
}
uid_range_to_seqs(fctx, &vuids, &level->definite_seqs);
array_clear(&vuids);
if (array_is_created(&br->maybe_uids)) {
- vbox->vfuncs.get_virtual_uids(fctx->box, br->box,
- &br->maybe_uids, &vuids);
+ fctx->box->virtual_vfuncs->get_virtual_uids(fctx->box,
+ br->box, &br->maybe_uids, &vuids);
}
uid_range_to_seqs(fctx, &vuids, &level->maybe_seqs);
if (array_is_created(&br->scores))
- level_scores_add_vuids(vbox, level, br);
+ level_scores_add_vuids(fctx->box, level, br);
}
return 0;
}
{
enum fts_lookup_flags flags = fctx->flags |
(and_args ? FTS_LOOKUP_FLAG_AND_ARGS : 0);
- struct virtual_mailbox *vbox = (struct virtual_mailbox *)fctx->box;
ARRAY_TYPE(mailboxes) mailboxes_arr, tmp_mailboxes;
struct mailbox *const *mailboxes;
struct fts_backend *backend;
unsigned int i, j, mailbox_count;
p_array_init(&mailboxes_arr, fctx->result_pool, 8);
- vbox->vfuncs.get_virtual_backend_boxes(fctx->box, &mailboxes_arr, TRUE);
+ fctx->box->virtual_vfuncs->get_virtual_backend_boxes(fctx->box,
+ &mailboxes_arr, TRUE);
array_sort(&mailboxes_arr, mailbox_cmp_fts_backend);
memset(&result, 0, sizeof(result));
#include "mail-search-build.h"
#include "mail-storage-private.h"
#include "mailbox-list-private.h"
-#include "../virtual/virtual-storage.h"
#include "fts-api-private.h"
#include "fts-tokenizer.h"
#include "fts-indexer.h"
fctx->args = args;
fctx->result_pool = pool_alloconly_create("fts results", 1024*64);
fctx->orig_matches = buffer_create_dynamic(default_pool, 64);
- fctx->virtual_mailbox =
- strcmp(t->box->storage->name, VIRTUAL_STORAGE_NAME) == 0;
+ fctx->virtual_mailbox = t->box->virtual_vfuncs != NULL;
fctx->enforced =
mail_user_plugin_getenv_bool(t->box->storage->user,
"fts_enforced");
fmail = p_new(mail->pool, struct fts_mail, 1);
fmail->module_ctx.super = *v;
mail->vlast = &fmail->module_ctx.super;
- fmail->virtual_mail =
- strcmp(_mail->box->storage->name, VIRTUAL_STORAGE_NAME) == 0;
+ fmail->virtual_mail = _mail->box->virtual_vfuncs != NULL;
v->get_special = fts_mail_get_special;
v->precache = fts_mail_precache;
mbox->box.storage = _storage;
mbox->box.list = list;
mbox->box.mail_vfuncs = &virtual_mail_vfuncs;
- mbox->vfuncs = virtual_mailbox_vfuncs;
+ mbox->box.virtual_vfuncs = &virtual_mailbox_vfuncs;
index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
};
ARRAY_DEFINE_TYPE(virtual_backend_box, struct virtual_backend_box *);
-struct virtual_mailbox_vfuncs {
- /* convert backend UIDs to virtual UIDs. if some backend UID doesn't
- exist in mailbox, it's simply ignored */
- void (*get_virtual_uids)(struct mailbox *box,
- struct mailbox *backend_mailbox,
- const ARRAY_TYPE(seq_range) *backend_uids,
- ARRAY_TYPE(seq_range) *virtual_uids_r);
- /* like get_virtual_uids(), but if a backend UID doesn't exist,
- convert it to 0. */
- void (*get_virtual_uid_map)(struct mailbox *box,
- struct mailbox *backend_mailbox,
- const ARRAY_TYPE(seq_range) *backend_uids,
- ARRAY_TYPE(uint32_t) *virtual_uids_r);
- void (*get_virtual_backend_boxes)(struct mailbox *box,
- ARRAY_TYPE(mailboxes) *mailboxes,
- bool only_with_msgs);
-};
-
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;