fts-api-private.h revision b7fdf4fe23801de680e0be5aca0596a3c9ea3f8f
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#ifndef FTS_API_PRIVATE_H
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#define FTS_API_PRIVATE_H
53febe02364e20b2b95594ca8e7906a37973be01Timo Sirainen
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen#include "fts-api.h"
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct mail_user;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct mailbox_list;
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen#define MAILBOX_GUID_HEX_LENGTH (GUID_128_SIZE*2)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
677e22747b82bf15b339e31d1d0106d62bf806daTimo Sirainenstruct fts_backend_vfuncs {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct fts_backend *(*alloc)(void);
677e22747b82bf15b339e31d1d0106d62bf806daTimo Sirainen int (*init)(struct fts_backend *backend, const char **error_r);
677e22747b82bf15b339e31d1d0106d62bf806daTimo Sirainen void (*deinit)(struct fts_backend *backend);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen int (*get_last_uid)(struct fts_backend *backend, struct mailbox *box,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen uint32_t *last_uid_r);
a966016e605eea27e02d73ff1412632cd684d770Timo Sirainen
bc10373fc050eb9dd23f6ed5ee8207d0e4d142eeTimo Sirainen struct fts_backend_update_context *
9d1526ac8bcec9aff3c3a32f092ee2f3da2760b7Timo Sirainen (*update_init)(struct fts_backend *backend);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen int (*update_deinit)(struct fts_backend_update_context *ctx);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
9d1526ac8bcec9aff3c3a32f092ee2f3da2760b7Timo Sirainen void (*update_set_mailbox)(struct fts_backend_update_context *ctx,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct mailbox *box);
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen void (*update_expunge)(struct fts_backend_update_context *ctx,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen uint32_t uid);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
a35cbba04d0a2823da98e693bd09a051addffdb2Timo Sirainen /* Start a build for specified key */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen bool (*update_set_build_key)(struct fts_backend_update_context *ctx,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen const struct fts_backend_build_key *key);
cb951d3282610a9a0960230865bc5f3e3347b203Timo Sirainen /* Finish a build for specified key - guaranteed to be called */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen void (*update_unset_build_key)(struct fts_backend_update_context *ctx);
b863b7e3fccf75f90f613b875f02fd1781e14e5eTimo Sirainen /* Add data for current build key */
b863b7e3fccf75f90f613b875f02fd1781e14e5eTimo Sirainen int (*update_build_more)(struct fts_backend_update_context *ctx,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen const unsigned char *data, size_t size);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen int (*refresh)(struct fts_backend *backend);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen int (*rescan)(struct fts_backend *backend);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen int (*optimize)(struct fts_backend *backend);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen bool (*can_lookup)(struct fts_backend *backend,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen const struct mail_search_arg *args);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen int (*lookup)(struct fts_backend *backend, struct mailbox *box,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen struct mail_search_arg *args, bool and_args,
b863b7e3fccf75f90f613b875f02fd1781e14e5eTimo Sirainen struct fts_result *result);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen int (*lookup_multi)(struct fts_backend *backend,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen struct mailbox *const boxes[],
e1b13a5c1507c2583fc6bd07e690037be8a802a7Timo Sirainen struct mail_search_arg *args, bool and_args,
e1b13a5c1507c2583fc6bd07e690037be8a802a7Timo Sirainen struct fts_multi_result *result);
26ada766cfff6ebfb91d100936118cf8aa51e3aeTimo Sirainen void (*lookup_done)(struct fts_backend *backend);
f4526ec0e620af27bc027955f7a56cfe187c212fTimo Sirainen};
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenenum fts_backend_flags {
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen /* Backend supports indexing binary MIME parts */
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen FTS_BACKEND_FLAG_BINARY_MIME_PARTS = 0x01,
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen /* Send built text to backend as decomposed titlecase rather than
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen preserving original case */
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen FTS_BACKEND_FLAG_BUILD_DTCASE = 0x02
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen};
b200bc3875fa06d42c8619865cc306c3297fcaccAki Tuomi
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstruct fts_backend {
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen const char *name;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen enum fts_backend_flags flags;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
b200bc3875fa06d42c8619865cc306c3297fcaccAki Tuomi struct fts_backend_vfuncs v;
b200bc3875fa06d42c8619865cc306c3297fcaccAki Tuomi struct mail_namespace *ns;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen unsigned int updating:1;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen unsigned int syncing:1;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen};
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainenstruct fts_backend_update_context {
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen struct fts_backend *backend;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen
4c7caf83adc56d54e2ecec0a803f5ca9b6d0498dTimo Sirainen struct mailbox *cur_box, *backend_box;
667f09546abd3d3636b277fec9dba8622cb3d644Timo Sirainen
06d1238dd2a6b87af5ad1fad53d7b9b74ad93bfaTimo Sirainen unsigned int build_key_open:1;
acbd82bd456316a32f61df67fc41bbff681119c7Timo Sirainen unsigned int failed:1;
acbd82bd456316a32f61df67fc41bbff681119c7Timo Sirainen};
9fd7e883292dab58f3c209f0ec6a8cd11e52075cTimo Sirainen
d0cc826dab58ed8e30e1ccd7cb6ad2f44b391a00Timo Sirainenstruct fts_index_header {
f0339f522dc9c8e2e8a29ef9a3f937c431c6bd1bTimo Sirainen uint32_t last_indexed_uid;
f0339f522dc9c8e2e8a29ef9a3f937c431c6bd1bTimo Sirainen
d0cc826dab58ed8e30e1ccd7cb6ad2f44b391a00Timo Sirainen /* Checksum of settings. If the settings change, the index should
acbd82bd456316a32f61df67fc41bbff681119c7Timo Sirainen be rebuilt. */
fba3d682d6bad6a9530b254d6fd07dc5577be7feTimo Sirainen uint32_t settings_checksum;
23bdbb7b1831785c6ba6df190f6369da882d2b9dTimo Sirainen uint32_t unused;
d0cc826dab58ed8e30e1ccd7cb6ad2f44b391a00Timo Sirainen};
a321662b406acc9c9e6fe52332236740d449f591Timo Sirainen
a5563dc790a44bb58860d74479a24349f593d68fTimo Sirainenvoid fts_backend_register(const struct fts_backend *backend);
f740f218bbb1a98cea08dd82b601a8dd50f35093Timo Sirainenvoid fts_backend_unregister(const char *name);
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen
a5563dc790a44bb58860d74479a24349f593d68fTimo Sirainenbool fts_backend_default_can_lookup(struct fts_backend *backend,
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen const struct mail_search_arg *args);
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainenvoid fts_filter_uids(ARRAY_TYPE(seq_range) *definite_dest,
fdbcd3027578d35cb6e12b44c06a46905024e300Timo Sirainen const ARRAY_TYPE(seq_range) *definite_filter,
fdbcd3027578d35cb6e12b44c06a46905024e300Timo Sirainen ARRAY_TYPE(seq_range) *maybe_dest,
3a53aff14d327af2819b4755864b3571703683b8Timo Sirainen const ARRAY_TYPE(seq_range) *maybe_filter);
3a53aff14d327af2819b4755864b3571703683b8Timo Sirainen
797d20c35779d68f2542d3e287c1a869048c8f26Timo Sirainen/* Returns TRUE if ok, FALSE if no fts header */
a35cbba04d0a2823da98e693bd09a051addffdb2Timo Sirainenbool fts_index_get_header(struct mailbox *box, struct fts_index_header *hdr_r);
797d20c35779d68f2542d3e287c1a869048c8f26Timo Sirainenint fts_index_set_header(struct mailbox *box,
797d20c35779d68f2542d3e287c1a869048c8f26Timo Sirainen const struct fts_index_header *hdr);
797d20c35779d68f2542d3e287c1a869048c8f26Timo Sirainenint fts_index_set_last_uid(struct mailbox *box, uint32_t last_uid);
88c580cdff2656df007fdfe5bd8ca8a465ee605aTimo Sirainenint fts_index_have_compatible_settings(struct mailbox_list *list,
88c580cdff2656df007fdfe5bd8ca8a465ee605aTimo Sirainen uint32_t checksum);
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen
acbd82bd456316a32f61df67fc41bbff681119c7Timo Sirainen/* Returns TRUE if FTS backend should index the header for optimizing
acbd82bd456316a32f61df67fc41bbff681119c7Timo Sirainen separate lookups */
acbd82bd456316a32f61df67fc41bbff681119c7Timo Sirainenbool fts_header_want_indexed(const char *hdr_name);
23ad3970cd22adb6c875caf95fa791548849f0d1Timo Sirainen
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainenint fts_mailbox_get_guid(struct mailbox *box, const char **guid_r);
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen/* Returns fd, which you can either read from or close. */
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainenint fts_indexer_cmd(struct mail_user *user, const char *cmd,
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen const char **path_r);
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen#endif
de02255bbe97d5d5c54ca1054bb7c9304ee025a1Timo Sirainen