]> git.notmuchmail.org Git - notmuch/blobdiff - lib/notmuch-private.h
Optimize thread search using matched docid sets.
[notmuch] / lib / notmuch-private.h
index d52d84d41ad1055b379dba19a7100e09fcbbd823..303aeb30d94ec0098d0057406c1b66d22365b456 100644 (file)
@@ -48,6 +48,8 @@ NOTMUCH_BEGIN_DECLS
 
 #include "xutil.h"
 
+#pragma GCC visibility push(hidden)
+
 #ifdef DEBUG
 # define DEBUG_DATABASE_SANITY 1
 # define DEBUG_QUERY 1
@@ -55,6 +57,9 @@ NOTMUCH_BEGIN_DECLS
 
 #define COMPILE_TIME_ASSERT(pred) ((void)sizeof(char[1 - 2*!(pred)]))
 
+#define STRNCMP_LITERAL(var, literal) \
+    strncmp ((var), (literal), sizeof (literal) - 1)
+
 /* There's no point in continuing when we've detected that we've done
  * something wrong internally (as opposed to the user passing in a
  * bogus value).
@@ -108,6 +113,16 @@ typedef enum {
  * programmatically. */
 #define NOTMUCH_TERM_MAX 245
 
+#define NOTMUCH_METADATA_THREAD_ID_PREFIX "thread_id_"
+
+/* For message IDs we have to be even more restrictive. Beyond fitting
+ * into the term limit, we also use message IDs to construct
+ * metadata-key values. And the documentation says that these should
+ * be restricted to about 200 characters. (The actual limit for the
+ * chert backend at least is 252.)
+ */
+#define NOTMUCH_MESSAGE_ID_MAX (200 - sizeof (NOTMUCH_METADATA_THREAD_ID_PREFIX))
+
 typedef enum _notmuch_private_status {
     /* First, copy all the public status values. */
     NOTMUCH_PRIVATE_STATUS_SUCCESS = NOTMUCH_STATUS_SUCCESS,
@@ -141,6 +156,8 @@ typedef enum _notmuch_private_status {
      :                                                                 \
      (notmuch_status_t) private_status)
 
+typedef struct _notmuch_doc_id_set notmuch_doc_id_set_t;
+
 /* database.cc */
 
 /* Lookup a prefix value by name.
@@ -167,6 +184,9 @@ _notmuch_database_split_path (void *ctx,
 const char *
 _notmuch_database_get_directory_db_path (const char *path);
 
+unsigned int
+_notmuch_database_generate_doc_id (notmuch_database_t *notmuch);
+
 notmuch_private_status_t
 _notmuch_database_find_unique_doc_id (notmuch_database_t *notmuch,
                                      const char *prefix_name,
@@ -204,8 +224,9 @@ _notmuch_directory_get_document_id (notmuch_directory_t *directory);
 notmuch_thread_t *
 _notmuch_thread_create (void *ctx,
                        notmuch_database_t *notmuch,
-                       const char *thread_id,
-                       const char *query_string);
+                       unsigned int seed_doc_id,
+                       notmuch_doc_id_set_t *match_set,
+                       notmuch_sort_t sort);
 
 /* message.cc */
 
@@ -220,6 +241,9 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch,
                                        const char *message_id,
                                        notmuch_private_status_t *status);
 
+unsigned int
+_notmuch_message_get_doc_id (notmuch_message_t *message);
+
 const char *
 _notmuch_message_get_in_reply_to (notmuch_message_t *message);
 
@@ -245,6 +269,10 @@ notmuch_status_t
 _notmuch_message_add_filename (notmuch_message_t *message,
                               const char *filename);
 
+notmuch_status_t
+_notmuch_message_rename (notmuch_message_t *message,
+                        const char *new_filename);
+
 void
 _notmuch_message_ensure_thread_id (notmuch_message_t *message);
 
@@ -274,6 +302,16 @@ _notmuch_message_talloc_copy_data (notmuch_message_t *message);
 void
 _notmuch_message_clear_data (notmuch_message_t *message);
 
+/* Set the author member of 'message' - this is the representation used
+ * when displaying the message */
+void
+notmuch_message_set_author (notmuch_message_t *message, const char *author);
+
+/* Get the author member of 'message' */
+const char *
+notmuch_message_get_author (notmuch_message_t *message);
+
+
 /* index.cc */
 
 notmuch_status_t
@@ -333,6 +371,9 @@ notmuch_message_file_restrict_headersv (notmuch_message_file_t *message,
  *
  * The header name is case insensitive.
  *
+ * The Received: header is special - for it all Received: headers in
+ * the message are concatenated
+ *
  * The returned value is owned by the notmuch message and is valid
  * only until the message is closed. The caller should copy it if
  * needing to modify the value or to hold onto it for longer.
@@ -390,6 +431,14 @@ _notmuch_mset_messages_get (notmuch_messages_t *messages);
 void
 _notmuch_mset_messages_move_to_next (notmuch_messages_t *messages);
 
+notmuch_bool_t
+_notmuch_doc_id_set_contains (notmuch_doc_id_set_t *doc_ids,
+                              unsigned int doc_id);
+
+void
+_notmuch_doc_id_set_remove (notmuch_doc_id_set_t *doc_ids,
+                            unsigned int doc_id);
+
 /* message.cc */
 
 void
@@ -415,6 +464,40 @@ _notmuch_tags_add_tag (notmuch_tags_t *tags, const char *tag);
 void
 _notmuch_tags_prepare_iterator (notmuch_tags_t *tags);
 
+/* filenames.c */
+
+typedef struct _notmuch_filename_node {
+    char *filename;
+    struct _notmuch_filename_node *next;
+} notmuch_filename_node_t;
+
+typedef struct _notmuch_filename_list {
+    notmuch_filename_node_t *head;
+    notmuch_filename_node_t **tail;
+} notmuch_filename_list_t;
+
+notmuch_filename_list_t *
+_notmuch_filename_list_create (const void *ctx);
+
+/* Add 'filename' to 'list'.
+ *
+ * The list will create its own talloced copy of 'filename'.
+ */
+void
+_notmuch_filename_list_add_filename (notmuch_filename_list_t *list,
+                                    const char *filename);
+
+void
+_notmuch_filename_list_destroy (notmuch_filename_list_t *list);
+
+/* The notmuch_filenames_t is an iterator object for a
+ * notmuch_filename_list_t */
+notmuch_filenames_t *
+_notmuch_filenames_create (const void *ctx,
+                          notmuch_filename_list_t *list);
+
+#pragma GCC visibility pop
+
 NOTMUCH_END_DECLS
 
 #endif