Skip to content

Commit

Permalink
virtual: Moved virtual_mailbox_vfuncs to lib-storage.
Browse files Browse the repository at this point in the history
This allows implementing other virtual storage backends.
  • Loading branch information
sirainen authored and GitLab committed Jun 3, 2016
1 parent 54647e7 commit aa41b2e
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 43 deletions.
22 changes: 21 additions & 1 deletion src/lib-storage/mail-storage-private.h
Expand Up @@ -150,6 +150,24 @@ struct mail_attachment_part {
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);

Expand Down Expand Up @@ -286,7 +304,9 @@ struct mailbox {
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 */
Expand Down
12 changes: 9 additions & 3 deletions src/plugins/fts/fts-api.c
Expand Up @@ -8,7 +8,6 @@
#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;
Expand Down Expand Up @@ -90,7 +89,7 @@ int fts_backend_get_last_uid(struct fts_backend *backend, struct mailbox *box,
{
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))
Expand Down Expand Up @@ -228,7 +227,14 @@ int fts_backend_reset_last_uids(struct fts_backend *backend)

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);
}
Expand Down
23 changes: 10 additions & 13 deletions src/plugins/fts/fts-search.c
Expand Up @@ -5,7 +5,6 @@
#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"
Expand Down Expand Up @@ -63,7 +62,7 @@ static int fts_search_lookup_level_single(struct fts_search_context *fctx,
}

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;
Expand All @@ -78,8 +77,8 @@ level_scores_add_vuids(struct virtual_mailbox *vbox,
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);
Expand Down Expand Up @@ -110,7 +109,6 @@ multi_add_lookup_result(struct fts_search_context *fctx,
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;
Expand All @@ -132,21 +130,20 @@ multi_add_lookup_result(struct fts_search_context *fctx,

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;
}
Expand All @@ -157,7 +154,6 @@ static int fts_search_lookup_level_multi(struct fts_search_context *fctx,
{
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;
Expand All @@ -166,7 +162,8 @@ static int fts_search_lookup_level_multi(struct fts_search_context *fctx,
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));
Expand Down
7 changes: 2 additions & 5 deletions src/plugins/fts/fts-storage.c
Expand Up @@ -9,7 +9,6 @@
#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"
Expand Down Expand Up @@ -208,8 +207,7 @@ fts_mailbox_search_init(struct mailbox_transaction_context *t,
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");
Expand Down Expand Up @@ -534,8 +532,7 @@ void fts_mail_allocated(struct mail *_mail)
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;
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/virtual/virtual-storage.c
Expand Up @@ -260,7 +260,7 @@ virtual_mailbox_alloc(struct mail_storage *_storage, struct mailbox_list *list,
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);

Expand Down
20 changes: 0 additions & 20 deletions src/plugins/virtual/virtual-storage.h
Expand Up @@ -114,24 +114,6 @@ struct virtual_backend_box {
};
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;
Expand Down Expand Up @@ -161,8 +143,6 @@ struct virtual_mailbox {
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;
Expand Down

0 comments on commit aa41b2e

Please sign in to comment.