[RFC patch 4/5] WIP: store user prefixes

David Bremner david at tethera.net
Sat Nov 17 06:09:00 PST 2018


Maybe this should be unified into one prefix table?
---
 lib/database-private.h |  8 ++++++++
 lib/database.cc        | 32 +++++++++++++++++++-------------
 lib/notmuch-private.h  |  4 ++++
 lib/thread.cc          |  2 --
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/lib/database-private.h b/lib/database-private.h
index a499b259..f5e90099 100644
--- a/lib/database-private.h
+++ b/lib/database-private.h
@@ -178,6 +178,12 @@ operator&(notmuch_field_flag_t a, notmuch_field_flag_t b)
 				    Xapian::QueryParser::FLAG_WILDCARD | \
 				    Xapian::QueryParser::FLAG_PURE_NOT)
 
+typedef struct {
+    const char *name;
+    const char *prefix;
+    notmuch_field_flag_t flags;
+} prefix_t;
+
 struct _notmuch_database {
     bool exception_reported;
 
@@ -215,6 +221,8 @@ struct _notmuch_database {
     Xapian::ValueRangeProcessor *value_range_processor;
     Xapian::ValueRangeProcessor *date_range_processor;
     Xapian::ValueRangeProcessor *last_mod_range_processor;
+
+    prefix_t *user_prefix;
 };
 
 /* Prior to database version 3, features were implied by the database
diff --git a/lib/database.cc b/lib/database.cc
index fa77eb91..b2654ab7 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -41,12 +41,6 @@ using namespace std;
 
 #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0]))
 
-typedef struct {
-    const char *name;
-    const char *prefix;
-    notmuch_field_flag_t flags;
-} prefix_t;
-
 #define NOTMUCH_DATABASE_VERSION 3
 
 #define STRINGIFY(s) _SUB_STRINGIFY(s)
@@ -317,15 +311,24 @@ _setup_user_query_fields (notmuch_database_t *notmuch)
     void *local = talloc_new(notmuch);
     notmuch_status_t status;
 
+    size_t prefix_capacity = 4;
+    size_t prefix_index = 0;
+
+    notmuch->user_prefix = talloc_zero_array (notmuch, prefix_t, prefix_capacity);
+    if (notmuch->user_prefix == NULL)
+	return NOTMUCH_STATUS_OUT_OF_MEMORY;
+    
     status = notmuch_database_get_config_list (notmuch, "index.header.", &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
-		};
+	if (prefix_index >= prefix_capacity-1) {
+	    prefix_capacity *= 2;
+	    notmuch->user_prefix = talloc_realloc (notmuch, notmuch->user_prefix, prefix_t, prefix_capacity);
+	}
+
+	prefix_t *query_field =	&(notmuch->user_prefix[prefix_index]);
 
 	const char *key = notmuch_config_list_key (list)
 	    + sizeof (CONFIG_HEADER_PREFIX) - 1;
@@ -334,10 +337,13 @@ _setup_user_query_fields (notmuch_database_t *notmuch)
 	for (char *p = prefix + 1; *p; p++)
 	    *p = toupper (*p);
 
-	query_field.name = key;
-	query_field.prefix = prefix;
+	query_field->name = key;
+	query_field->prefix = prefix;
+	query_field->flags = NOTMUCH_FIELD_PROBABILISTIC | NOTMUCH_FIELD_EXTERNAL;
+
+	_setup_query_field_default (query_field, notmuch);
 
-	_setup_query_field_default (&query_field, notmuch);
+	prefix_index++;
     }
 
     talloc_free (local);
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index df32d39c..09f828ab 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -676,6 +676,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.19.1



More information about the notmuch mailing list