]> git.notmuchmail.org Git - notmuch/blobdiff - database.cc
Invent our own prefix values.
[notmuch] / database.cc
index 3d9672707b20a6213dc00cf4f83404da03508d5b..928e91ba7585617f9a64c3634b3ef2f39f6a3f0f 100644 (file)
@@ -30,24 +30,36 @@ using namespace std;
 
 #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0]))
 
-/* These prefix values are specifically chosen to be compatible
- * with sup, (http://sup.rubyforge.org), written by
- * William Morgan <wmorgan-sup@masanjin.net>, and released
- * under the GNU GPL v2.
- */
-
 typedef struct {
     const char *name;
     const char *prefix;
 } prefix_t;
 
-prefix_t BOOLEAN_PREFIX[] = {
-    { "type", "K" },
-    { "tag", "L" },
-    { "msgid", "Q" },
-    { "thread", "H" },
-    { "ref", "R" },
-    { "timestamp", "KTS" },
+/* With these prefix values we follow the conventions published here:
+ *
+ * http://xapian.org/docs/omega/termprefixes.html
+ *
+ * as much as makes sense. Note that I took some liberty in matching
+ * the reserved prefix values to notmuch concepts, (for example, 'G'
+ * is documented as "newsGroup (or similar entity - e.g. a web forum
+ * name)", for which I think the thread is the closest analogue in
+ * notmuch. This in spite of the fact that we will eventually be
+ * storing mailing-list messages where 'G' for "mailing list name"
+ * might be even a closer analogue. I'm treating the single-character
+ * prefixes preferentially for core notmuch concepts (which will be
+ * nearly universal to all mail messages).
+ */
+
+prefix_t BOOLEAN_PREFIX_INTERNAL[] = {
+    { "type", "T" },
+    { "thread", "G" },
+    { "ref", "XREFERENCE" },
+    { "timestamp", "XTIMESTAMP" },
+};
+
+prefix_t BOOLEAN_PREFIX_EXTERNAL[] = {
+    { "tag", "K" },
+    { "id", "Q" }
 };
 
 const char *
@@ -55,9 +67,13 @@ _find_prefix (const char *name)
 {
     unsigned int i;
 
-    for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX); i++)
-       if (strcmp (name, BOOLEAN_PREFIX[i].name) == 0)
-           return BOOLEAN_PREFIX[i].prefix;
+    for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX_INTERNAL); i++)
+       if (strcmp (name, BOOLEAN_PREFIX_INTERNAL[i].name) == 0)
+           return BOOLEAN_PREFIX_INTERNAL[i].prefix;
+
+    for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX_EXTERNAL); i++)
+       if (strcmp (name, BOOLEAN_PREFIX_EXTERNAL[i].name) == 0)
+           return BOOLEAN_PREFIX_EXTERNAL[i].prefix;
 
     fprintf (stderr, "Internal error: No prefix exists for '%s'\n", name);
     exit (1);
@@ -206,7 +222,7 @@ notmuch_database_find_message (notmuch_database_t *notmuch,
     notmuch_private_status_t status;
     unsigned int doc_id;
 
-    status = find_unique_doc_id (notmuch, "msgid", message_id, &doc_id);
+    status = find_unique_doc_id (notmuch, "id", message_id, &doc_id);
 
     if (status == NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND)
        return NULL;
@@ -469,6 +485,7 @@ notmuch_database_open (const char *path)
     struct stat st;
     int err;
     char *local_path = NULL;
+    unsigned int i;
 
     if (path == NULL)
        path = local_path = notmuch_database_default_path ();
@@ -493,6 +510,12 @@ notmuch_database_open (const char *path)
        notmuch->query_parser = new Xapian::QueryParser;
        notmuch->query_parser->set_default_op (Xapian::Query::OP_AND);
        notmuch->query_parser->set_database (*notmuch->xapian_db);
+
+       for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX_EXTERNAL); i++) {
+           prefix_t *prefix = &BOOLEAN_PREFIX_EXTERNAL[i];
+           notmuch->query_parser->add_boolean_prefix (prefix->name,
+                                                      prefix->prefix);
+       }
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred: %s\n",
                 error.get_msg().c_str());