changeset 8496:1e8f718884c4 HEAD

fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
author Timo Sirainen <tss@iki.fi>
date Sat, 29 Nov 2008 22:52:54 +0200
parents ffb37c392166
children 8a511d7da23f
files src/plugins/fts/fts-storage.c src/plugins/fts/fts-storage.h
diffstat 2 files changed, 31 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts/fts-storage.c	Sat Nov 29 22:39:44 2008 +0200
+++ b/src/plugins/fts/fts-storage.c	Sat Nov 29 22:52:54 2008 +0200
@@ -380,15 +380,35 @@
 
 static int fts_build_init(struct fts_search_context *fctx)
 {
+	struct mailbox_status status;
+	int ret;
+
+	mailbox_get_status(fctx->t->box, STATUS_MESSAGES | STATUS_UIDNEXT,
+			   &status);
+	if (status.messages == fctx->fbox->last_messages_count &&
+	    status.uidnext == fctx->fbox->last_uidnext) {
+		/* no new messages since last check */
+		return 0;
+	}
+
 	if (fctx->fbox->virtual)
-		return fts_build_init_virtual(fctx);
-	return fts_build_init_trans(fctx, fctx->t);
+		ret = fts_build_init_virtual(fctx);
+	else
+		ret = fts_build_init_trans(fctx, fctx->t);
+	if (ret == 0 && fctx->build_ctx == NULL) {
+		/* index was up-to-date */
+		fctx->fbox->last_messages_count = status.messages;
+		fctx->fbox->last_uidnext = status.uidnext;
+	}
+	return ret;
 }
 
 static int fts_build_deinit(struct fts_storage_build_context **_ctx)
 {
 	struct fts_storage_build_context *ctx = *_ctx;
 	struct mailbox *box = ctx->mail->transaction->box;
+	struct fts_mailbox *fbox = FTS_CONTEXT(box);
+	struct mailbox_status status;
 	int ret = 0;
 
 	*_ctx = NULL;
@@ -400,6 +420,13 @@
 	if (fts_backend_build_deinit(&ctx->build) < 0)
 		ret = -1;
 
+	if (ret == 0) {
+		mailbox_get_status(box, STATUS_MESSAGES | STATUS_UIDNEXT,
+				   &status);
+		fbox->last_messages_count = status.messages;
+		fbox->last_uidnext = status.uidnext;
+	}
+
 	if (ioloop_time - ctx->search_start_time.tv_sec >=
 	    FTS_BUILD_NOTIFY_INTERVAL_SECS) {
 		/* we notified at least once */
--- a/src/plugins/fts/fts-storage.h	Sat Nov 29 22:39:44 2008 +0200
+++ b/src/plugins/fts/fts-storage.h	Sat Nov 29 22:52:54 2008 +0200
@@ -6,6 +6,8 @@
 	struct fts_backend *backend_substr;
 	struct fts_backend *backend_fast;
 
+	unsigned int last_messages_count, last_uidnext;
+
 	const char *env;
 	unsigned int virtual:1;
 	unsigned int backend_set:1;