]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: Add fts_backend_is_uid_indexed() and fts_backend_vfuncs.is_uid_indexed()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 14 May 2018 20:32:08 +0000 (23:32 +0300)
committerMarco Bettini <marco.bettini@open-xchange.com>
Thu, 27 Jan 2022 14:35:03 +0000 (15:35 +0100)
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.

src/plugins/fts/fts-api-private.h
src/plugins/fts/fts-api.c
src/plugins/fts/fts-api.h

index a07056432b38c43cb3f1e90bb9194b14db0b81b5..18f255f914731a61b0f7a424e97f187b060d995d 100644 (file)
@@ -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);
index a6ea71672d41ddbe53ae76c6b48d69ae7ed23abe..015d629242fa0a2edeb5d67102133e5f7315c3e4 100644 (file)
@@ -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;
index 11a331f8a07c45fa7aacba7f617444ac1e859400..6ae54501d4ef08e287d3c80c8f601ef4a2fdcbd8 100644 (file)
@@ -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);