From b52cda90f0b05ce5055fb840e6d9dd88c09f1f83 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Sat, 17 Nov 2018 10:09:00 -0400 Subject: [PATCH] lib: cache user prefixes in database object This will be used to avoid needing a database access to resolve a db prefix from the corresponding UI prefix (e.g. when indexing). Arguably the setup of the separate header map does not belong here, since it is about indexing rather than querying, but we currently don't have any other indexing setup to do. --- lib/database-private.h | 5 +++++ lib/database.cc | 16 ++++++++++++++++ lib/notmuch-private.h | 2 ++ lib/thread.cc | 2 -- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index 293f2db4..9d1dabf1 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -221,6 +221,11 @@ struct _notmuch_database { Xapian::ValueRangeProcessor *value_range_processor; Xapian::ValueRangeProcessor *date_range_processor; Xapian::ValueRangeProcessor *last_mod_range_processor; + + /* XXX it's slightly gross to use two parallel string->string maps + * here, but at least they are small */ + notmuch_string_map_t *user_prefix; + notmuch_string_map_t *user_header; }; /* Prior to database version 3, features were implied by the database diff --git a/lib/database.cc b/lib/database.cc index dd1c1c7d..4f02815f 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -334,6 +334,14 @@ _setup_user_query_fields (notmuch_database_t *notmuch) notmuch_config_list_t *list; notmuch_status_t status; + notmuch->user_prefix = _notmuch_string_map_create (notmuch); + if (notmuch->user_prefix == NULL) + return NOTMUCH_STATUS_OUT_OF_MEMORY; + + notmuch->user_header = _notmuch_string_map_create (notmuch); + if (notmuch->user_header == NULL) + return NOTMUCH_STATUS_OUT_OF_MEMORY; + status = notmuch_database_get_config_list (notmuch, CONFIG_HEADER_PREFIX, &list); if (status) return status; @@ -345,6 +353,14 @@ _setup_user_query_fields (notmuch_database_t *notmuch) const char *key = notmuch_config_list_key (list) + sizeof (CONFIG_HEADER_PREFIX) - 1; + _notmuch_string_map_append (notmuch->user_prefix, + key, + _user_prefix (notmuch, key)); + + _notmuch_string_map_append (notmuch->user_header, + key, + notmuch_config_list_value (list)); + query_field.name = talloc_strdup (notmuch, key); query_field.prefix = _user_prefix (notmuch, key); query_field.flags = NOTMUCH_FIELD_PROBABILISTIC diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 39d11a91..09f828ab 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -678,6 +678,8 @@ struct _notmuch_indexopts { #define CONFIG_HEADER_PREFIX "index.header." +#define EMPTY_STRING(s) ((s)[0] == '\0') + NOTMUCH_END_DECLS #ifdef __cplusplus diff --git a/lib/thread.cc b/lib/thread.cc index c9c9398f..fd0e1393 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -30,8 +30,6 @@ #define THREAD_DEBUG(format, ...) do {} while (0) /* ignored */ #endif -#define EMPTY_STRING(s) ((s)[0] == '\0') - struct _notmuch_thread { notmuch_database_t *notmuch; char *thread_id;