From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id EB2956DE109D for ; Sat, 2 Mar 2019 07:41:45 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.008 X-Spam-Level: X-Spam-Status: No, score=-0.008 tagged_above=-999 required=5 tests=[AWL=-0.007, SPF_PASS=-0.001] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2GbdHe8FjwBX for ; Sat, 2 Mar 2019 07:41:45 -0800 (PST) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id A0BF46DE0F96 for ; Sat, 2 Mar 2019 07:41:44 -0800 (PST) Received: from remotemail by fethera.tethera.net with local (Exim 4.89) (envelope-from ) id 1h06lj-0004JM-OU; Sat, 02 Mar 2019 10:41:43 -0500 Received: (nullmailer pid 25729 invoked by uid 1000); Sat, 02 Mar 2019 15:41:37 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH 4/7] lib: cache user prefixes in database object Date: Sat, 2 Mar 2019 11:41:30 -0400 Message-Id: <20190302154133.25642-5-david@tethera.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190302154133.25642-1-david@tethera.net> References: <20190302154133.25642-1-david@tethera.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Mar 2019 15:41:46 -0000 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 seperate 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 | 39 ++++++++++++++++++++++++++++----------- lib/notmuch-private.h | 9 +++++++++ lib/thread.cc | 2 -- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index a499b259..57fddada 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -215,6 +215,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 4de79f79..6caa1311 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -299,8 +299,6 @@ prefix_t prefix_table[] = { NOTMUCH_FIELD_PROCESSOR}, }; -#define CONFIG_HEADER_PREFIX "index.header." - static void _setup_query_field_default (const prefix_t *prefix, notmuch_database_t *notmuch) { @@ -310,29 +308,48 @@ _setup_query_field_default (const prefix_t *prefix, notmuch_database_t *notmuch) notmuch->query_parser->add_boolean_prefix (prefix->name, prefix->prefix); } +const char * +_user_prefix (void *ctx, const char* name) +{ + return talloc_asprintf(ctx, "XU%s:", name); +} + static notmuch_status_t _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; + for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) { - prefix_t query_field { .name = NULL, .prefix = NULL, - .flags = NOTMUCH_FIELD_PROBABILISTIC | - NOTMUCH_FIELD_EXTERNAL - }; + prefix_t query_field; + + const char *key = notmuch_config_list_key (list) + + + sizeof (CONFIG_HEADER_PREFIX) - 1; - 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)); - char *prefix = talloc_asprintf(notmuch, "XU%s:", key); + _notmuch_string_map_append (notmuch->user_header, + key, + notmuch_config_list_value (list)); - query_field.name = key; - query_field.prefix = prefix; + query_field.name = talloc_strdup(notmuch, key); + query_field.prefix = _user_prefix(notmuch, key); + query_field.flags = NOTMUCH_FIELD_PROBABILISTIC | NOTMUCH_FIELD_EXTERNAL; _setup_query_field_default (&query_field, notmuch); } diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index df32d39c..1ef26e37 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -181,6 +181,11 @@ typedef struct _notmuch_doc_id_set notmuch_doc_id_set_t; const char * _find_prefix (const char *name); +/* Lookup a prefix value by name, including possibly user defined prefixes + */ +const char * +_notmuch_database_prefix (notmuch_database_t *notmuch, const char *name); + char * _notmuch_message_id_compressed (void *ctx, const char *message_id); @@ -676,6 +681,10 @@ struct _notmuch_indexopts { _notmuch_crypto_t crypto; }; +#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 47c90664..ae830064 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; -- 2.20.1