[PATCH 09/12] lib: add data_map field to message structs
David Bremner
david at tethera.net
Fri Jun 22 18:42:44 PDT 2018
This string-map stores the unserialized key-value map from the message
document data area. It is lazily read on the first read, and lazily
written by _notmuch_message_sync. Note that other than naming this is
independent from the other metadata, which is stored in document
terms (i.e. things you can search for).
---
lib/message.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/lib/message.cc b/lib/message.cc
index 153e4bed..bf597bc5 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -41,6 +41,7 @@ struct _notmuch_message {
notmuch_message_file_t *message_file;
notmuch_string_list_t *property_term_list;
notmuch_string_map_t *property_map;
+ notmuch_string_map_t *data_map;
notmuch_message_list_t *replies;
unsigned long flags;
/* For flags that are initialized on-demand, lazy_flags indicates
@@ -129,6 +130,7 @@ _notmuch_message_create_for_document (const void *talloc_owner,
message->author = NULL;
message->property_term_list = NULL;
message->property_map = NULL;
+ message->data_map = NULL;
message->replies = _notmuch_message_list_create (message);
if (unlikely (message->replies == NULL)) {
@@ -334,7 +336,6 @@ _notmuch_message_get_thread_id_only (notmuch_message_t *message)
return message->thread_id;
}
-
static void
_notmuch_message_ensure_metadata (notmuch_message_t *message, void *field)
{
@@ -483,6 +484,19 @@ _notmuch_message_invalidate_metadata (notmuch_message_t *message,
}
}
+static void
+_notmuch_message_ensure_data_map (notmuch_message_t *message)
+{
+ if (message->data_map)
+ return;
+
+ char *blob = talloc_strdup(message, message->doc.get_data().c_str ());
+
+ message->data_map = _notmuch_string_map_deserialize (message, blob);
+
+ talloc_free (blob);
+}
+
unsigned int
_notmuch_message_get_doc_id (notmuch_message_t *message)
{
@@ -1169,6 +1183,13 @@ _notmuch_message_sync (notmuch_message_t *message)
_notmuch_database_new_revision (
message->notmuch)));
+ if (message->notmuch->features & NOTMUCH_FEATURE_MESSAGE_DATA
+ && message->data_map) {
+ const char *blob = _notmuch_string_map_serialize (message,
+ message->data_map);
+ message->doc.set_data (blob);
+ }
+
db = static_cast <Xapian::WritableDatabase *> (message->notmuch->xapian_db);
db->replace_document (message->doc_id, message->doc);
message->modified = false;
@@ -1930,6 +1951,36 @@ notmuch_message_get_database (const notmuch_message_t *message)
return message->notmuch;
}
+notmuch_status_t
+_notmuch_message_data_get (notmuch_message_t *message, const char *key, const char **value)
+{
+ if (! message || !key || !value)
+ return NOTMUCH_STATUS_NULL_POINTER;
+
+ _notmuch_message_ensure_data_map (message);
+
+ *value = _notmuch_string_map_get (message->data_map, key);
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
+notmuch_status_t
+_notmuch_message_data_set (notmuch_message_t *message, const char *key, const char *value)
+{
+ if (! message || !key || !value)
+ return NOTMUCH_STATUS_NULL_POINTER;
+
+ notmuch_status_t status = _notmuch_database_ensure_writable (message->notmuch);
+ if (status)
+ return status;
+
+ _notmuch_message_ensure_data_map (message);
+
+ _notmuch_string_map_set (message->data_map, key, value);
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
static void
_notmuch_message_ensure_property_map (notmuch_message_t *message)
{
--
2.17.1
More information about the notmuch
mailing list