fts-api.c revision 12055678401e913f4be130fa41b22fbeb626cc7e
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2006-2010 Dovecot authors, see the included COPYING file */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic ARRAY_DEFINE(backends, const struct fts_backend *);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenvoid fts_backend_register(const struct fts_backend *backend)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen unsigned int i, count;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen for (i = 0; i < count; i++) {
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen i_panic("fts_backend_unregister(%s): unknown backend", name);
459c61c9a0beaa6986958d55b059b2d246032c4cTimo Sirainenstatic const struct fts_backend *
459c61c9a0beaa6986958d55b059b2d246032c4cTimo Sirainenfts_backend_class_lookup(const char *backend_name)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen unsigned int i, count;
c63544d7d2580c680b07f9569e87e9cebee383d5Timo Sirainen for (i = 0; i < count; i++) {
459c61c9a0beaa6986958d55b059b2d246032c4cTimo Sirainenfts_backend_init(const char *backend_name, struct mailbox *box)
459c61c9a0beaa6986958d55b059b2d246032c4cTimo Sirainen i_error("Unknown FTS backend: %s", backend_name);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenvoid fts_backend_deinit(struct fts_backend **_backend)
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainenint fts_backend_get_last_uid(struct fts_backend *backend, uint32_t *last_uid_r)
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainen return backend->v.get_last_uid(backend, last_uid_r);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenint fts_backend_get_all_last_uids(struct fts_backend *backend, pool_t pool,
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen return backend->v.get_all_last_uids(backend, pool, last_uids);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenint fts_backend_build_init(struct fts_backend *backend, uint32_t *last_uid_r,
1eb887d0fb04c184f56d122dc478b9c7d4a95cc4Timo Sirainen ret = backend->v.build_init(backend, last_uid_r, ctx_r);
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainenvoid fts_backend_build_hdr(struct fts_backend_build_context *ctx, uint32_t uid)
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainenbool fts_backend_build_body_begin(struct fts_backend_build_context *ctx,
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainen return ctx->backend->v.build_body_begin(ctx, uid, content_type,
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainenvoid fts_backend_build_body_end(struct fts_backend_build_context *ctx)
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainenint fts_backend_build_more(struct fts_backend_build_context *ctx,
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainen return ctx->backend->v.build_more(ctx, data, size);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenint fts_backend_build_deinit(struct fts_backend_build_context **_ctx)
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen struct fts_backend_build_context *ctx = *_ctx;
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainenbool fts_backend_is_building(struct fts_backend *backend)
fda168427e1950518acd6d600f1a10a29a5baef0Timo Sirainenvoid fts_backend_expunge(struct fts_backend *backend, struct mail *mail)
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainenvoid fts_backend_expunge_finish(struct fts_backend *backend,
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen backend->v.expunge_finish(backend, box, committed);
3d4450c252790b03bb5ce054987ac91110f1ff62Timo Sirainenint fts_backend_lock(struct fts_backend *backend)
3d4450c252790b03bb5ce054987ac91110f1ff62Timo Sirainenvoid fts_backend_unlock(struct fts_backend *backend)
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainenfts_merge_maybies(ARRAY_TYPE(seq_range) *dest_maybe,
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen unsigned int i, count;
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen /* add/leave to dest_maybe if at least one list has maybe,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen and no lists have none */
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen /* create unwanted sequences list from both sources */
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen new_range.seq1 = 0; new_range.seq2 = (uint32_t)-1;
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen seq_range_array_remove_seq_range(&src_unwanted, src_maybe);
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen seq_range_array_remove_seq_range(&src_unwanted, src_definite);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen /* drop unwanted uids */
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen seq_range_array_remove_seq_range(dest_maybe, &src_unwanted);
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen /* add uids that are in dest_definite and src_maybe lists */
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen for (i = 0; i < count; i++) {
a1f517528af314cb6f5f39187a71dbed8a6e1152Timo Sirainen for (seq = range[i].seq1; seq <= range[i].seq2; seq++) {
809923ba26218971792182ae8894936f9ac99364Timo Sirainenvoid fts_filter_uids(ARRAY_TYPE(seq_range) *definite_dest,
809923ba26218971792182ae8894936f9ac99364Timo Sirainen /* keep only what exists in both lists. the rest is in
809923ba26218971792182ae8894936f9ac99364Timo Sirainen maybies or not wanted */
809923ba26218971792182ae8894936f9ac99364Timo Sirainen seq_range_array_intersect(definite_dest, definite_filter);
809923ba26218971792182ae8894936f9ac99364Timo Sirainenstatic void fts_lookup_invert(ARRAY_TYPE(seq_range) *definite_uids,
809923ba26218971792182ae8894936f9ac99364Timo Sirainen /* we'll begin by inverting definite UIDs */
809923ba26218971792182ae8894936f9ac99364Timo Sirainen seq_range_array_invert(definite_uids, 1, (uint32_t)-1);
809923ba26218971792182ae8894936f9ac99364Timo Sirainen /* from that list remove UIDs in the maybe list.
809923ba26218971792182ae8894936f9ac99364Timo Sirainen the maybe list itself isn't touched. */
809923ba26218971792182ae8894936f9ac99364Timo Sirainen (void)seq_range_array_remove_seq_range(definite_uids, maybe_uids);
809923ba26218971792182ae8894936f9ac99364Timo Sirainenstatic int fts_backend_lookup(struct fts_backend *backend, const char *key,
809923ba26218971792182ae8894936f9ac99364Timo Sirainen ret = backend->v.lookup(backend, key, flags & ~FTS_LOOKUP_FLAG_INVERT,
809923ba26218971792182ae8894936f9ac99364Timo Sirainenstatic int fts_backend_filter(struct fts_backend *backend, const char *key,
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen ARRAY_TYPE(seq_range) tmp_definite, tmp_maybe;
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen /* do this ourself */
809923ba26218971792182ae8894936f9ac99364Timo Sirainenfts_backend_lookup_init(struct fts_backend *backend)
809923ba26218971792182ae8894936f9ac99364Timo Sirainen pool = pool_alloconly_create("fts backend lookup", 256);
809923ba26218971792182ae8894936f9ac99364Timo Sirainen ctx = p_new(pool, struct fts_backend_lookup_context, 1);
809923ba26218971792182ae8894936f9ac99364Timo Sirainenvoid fts_backend_lookup_add(struct fts_backend_lookup_context *ctx,
809923ba26218971792182ae8894936f9ac99364Timo Sirainenstatic int fts_backend_lookup_old(struct fts_backend_lookup_context *ctx,
809923ba26218971792182ae8894936f9ac99364Timo Sirainen const struct fts_backend_lookup_field *fields;
809923ba26218971792182ae8894936f9ac99364Timo Sirainen unsigned int i, count;
809923ba26218971792182ae8894936f9ac99364Timo Sirainen if (fts_backend_lookup(ctx->backend, fields[0].key, fields[0].flags,
809923ba26218971792182ae8894936f9ac99364Timo Sirainenint fts_backend_lookup_deinit(struct fts_backend_lookup_context **_ctx,
809923ba26218971792182ae8894936f9ac99364Timo Sirainen struct fts_backend_lookup_context *ctx = *_ctx;
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen ret = ctx->backend->v.lookup2(ctx, definite_uids, maybe_uids,
809923ba26218971792182ae8894936f9ac99364Timo Sirainen ret = fts_backend_lookup_old(ctx, definite_uids, maybe_uids);
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainenbool fts_backend_default_can_index(const char *content_type)
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainen return strncasecmp(content_type, "text/", 5) == 0 ||