From: Timo Sirainen Date: Mon, 14 May 2018 20:32:08 +0000 (+0300) Subject: fts: Add fts_backend_is_uid_indexed() and fts_backend_vfuncs.is_uid_indexed() X-Git-Tag: 2.4.0~4610 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b2b7ed96c6930e589c46fa1be360051816a9cc4d;p=thirdparty%2Fdovecot%2Fcore.git fts: Add fts_backend_is_uid_indexed() and fts_backend_vfuncs.is_uid_indexed() Backends may be able to optimize this better than get_last_uid(), because they only need to verify whether the given UID is indexed or not. This allows e.g. caching internally without having to refresh the index to see whether another mail was just recently indexed. If the new vfunc isn't implemented by the backend, get_last_uid() is used to implement it. --- diff --git a/src/plugins/fts/fts-api-private.h b/src/plugins/fts/fts-api-private.h index a07056432b..18f255f914 100644 --- a/src/plugins/fts/fts-api-private.h +++ b/src/plugins/fts/fts-api-private.h @@ -16,6 +16,9 @@ struct fts_backend_vfuncs { int (*get_last_uid)(struct fts_backend *backend, struct mailbox *box, uint32_t *last_uid_r); + /* If NULL, this is implemented using get_last_uid() */ + int (*is_uid_indexed)(struct fts_backend *backend, struct mailbox *box, + uint32_t uid, uint32_t *last_indexed_uid_r); struct fts_backend_update_context * (*update_init)(struct fts_backend *backend); diff --git a/src/plugins/fts/fts-api.c b/src/plugins/fts/fts-api.c index a6ea71672d..015d629242 100644 --- a/src/plugins/fts/fts-api.c +++ b/src/plugins/fts/fts-api.c @@ -126,6 +126,23 @@ int fts_backend_get_last_uid(struct fts_backend *backend, struct mailbox *box, return backend->v.get_last_uid(backend, box, last_uid_r); } +int fts_backend_is_uid_indexed(struct fts_backend *backend, struct mailbox *box, + uint32_t uid, uint32_t *last_indexed_uid_r) +{ + uint32_t last_uid; + + if (box->virtual_vfuncs != NULL || backend->v.is_uid_indexed == NULL) { + if (fts_backend_get_last_uid(backend, box, &last_uid) < 0) + return -1; + if (uid > last_uid) { + *last_indexed_uid_r = last_uid; + return 0; + } + return 1; + } + return backend->v.is_uid_indexed(backend, box, uid, last_indexed_uid_r); +} + bool fts_backend_is_updating(struct fts_backend *backend) { return backend->updating; diff --git a/src/plugins/fts/fts-api.h b/src/plugins/fts/fts-api.h index 11a331f8a0..6ae54501d4 100644 --- a/src/plugins/fts/fts-api.h +++ b/src/plugins/fts/fts-api.h @@ -100,6 +100,10 @@ void fts_backend_deinit(struct fts_backend **backend); /* Get the last_uid for the mailbox. */ int fts_backend_get_last_uid(struct fts_backend *backend, struct mailbox *box, uint32_t *last_uid_r); +/* Returns 1 if uid has already been indexed, 0 if not, -1 on error. + If 0 is returned, also return last_indexed_uid_r. */ +int fts_backend_is_uid_indexed(struct fts_backend *backend, struct mailbox *box, + uint32_t uid, uint32_t *last_indexed_uid_r); /* Returns TRUE if there exists an update context. */ bool fts_backend_is_updating(struct fts_backend *backend);