#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" },
- { "id", "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 *
{
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);
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;
struct stat st;
int err;
char *local_path = NULL;
+ unsigned int i;
if (path == NULL)
path = local_path = notmuch_database_default_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);
- notmuch->query_parser->add_boolean_prefix ("id", _find_prefix ("id"));
- notmuch->query_parser->add_boolean_prefix ("tag", _find_prefix ("tag"));
- notmuch->query_parser->add_boolean_prefix ("type", _find_prefix ("type"));
+
+ 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());
try {
status = find_timestamp_document (notmuch, db_key, &doc, &doc_id);
- doc.add_value (0, Xapian::sortable_serialise (timestamp));
+ doc.add_value (NOTMUCH_VALUE_TIMESTAMP,
+ Xapian::sortable_serialise (timestamp));
if (status == NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND) {
char *term = talloc_asprintf (NULL, "%s%s",
if (status == NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND)
goto DONE;
- ret = Xapian::sortable_unserialise (doc.get_value (0));
+ ret = Xapian::sortable_unserialise (doc.get_value (NOTMUCH_VALUE_TIMESTAMP));
} catch (Xapian::Error &error) {
goto DONE;
}