]> git.notmuchmail.org Git - notmuch/blobdiff - database.cc
Add notmuch_message_get_thread_ids function
[notmuch] / database.cc
index 1aef2a966ec3fb431ff3b6f92735f0fdb57f4326..00b03731206289b171736dd8f9c4044a67f8f0a8 100644 (file)
 
 using namespace std;
 
-#define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0]))
-
-/* Xapian complains if we provide a term longer than this. */
-#define NOTMUCH_MAX_TERM 245
-
-/* 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 NORMAL_PREFIX[] = {
-    { "subject", "S" },
-    { "body", "B" },
-    { "from_name", "FN" },
-    { "to_name", "TN" },
-    { "name", "N" },
-    { "attachment", "A" }
-};
-
-prefix_t BOOLEAN_PREFIX[] = {
-    { "type", "K" },
-    { "from_email", "FE" },
-    { "to_email", "TE" },
-    { "email", "E" },
-    { "date", "D" },
-    { "label", "L" },
-    { "source_id", "I" },
-    { "attachment_extension", "O" },
-    { "msgid", "Q" },
-    { "thread", "H" },
-    { "ref", "R" }
-};
-
-static const char *
-find_prefix (const char *name)
-{
-    unsigned int i;
-
-    for (i = 0; i < ARRAY_SIZE (NORMAL_PREFIX); i++)
-       if (strcmp (name, NORMAL_PREFIX[i].name) == 0)
-           return NORMAL_PREFIX[i].prefix;
-
-    for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX); i++)
-       if (strcmp (name, BOOLEAN_PREFIX[i].name) == 0)
-           return BOOLEAN_PREFIX[i].prefix;
-
-    return "";
-}
-
 /* "128 bits of thread-id ought to be enough for anybody" */
 #define NOTMUCH_THREAD_ID_BITS  128
 #define NOTMUCH_THREAD_ID_DIGITS (NOTMUCH_THREAD_ID_BITS / 4)
@@ -130,11 +75,11 @@ add_term (Xapian::Document doc,
     if (value == NULL)
        return;
 
-    prefix = find_prefix (prefix_name);
+    prefix = _find_prefix (prefix_name);
 
     term = g_strdup_printf ("%s%s", prefix, value);
 
-    if (strlen (term) <= NOTMUCH_MAX_TERM)
+    if (strlen (term) <= NOTMUCH_TERM_MAX)
        doc.add_term (term);
 
     g_free (term);
@@ -150,7 +95,7 @@ find_messages_by_term (Xapian::Database *db,
     Xapian::PostingIterator i;
     char *term;
 
-    term = g_strdup_printf ("%s%s", find_prefix (prefix_name), value);
+    term = g_strdup_printf ("%s%s", _find_prefix (prefix_name), value);
 
     *begin = db->postlist_begin (term);
 
@@ -456,10 +401,8 @@ notmuch_database_open (const char *path)
 
     xapian_path = g_strdup_printf ("%s/%s", notmuch_path, "xapian");
 
-    /* C++ is so nasty in requiring these casts. I'm almost tempted to
-     * write a C wrapper for Xapian... */
-    notmuch = (notmuch_database_t *) xmalloc (sizeof (notmuch_database_t));
-    notmuch->path = xstrdup (path);
+    notmuch = talloc (NULL, notmuch_database_t);
+    notmuch->path = talloc_strdup (notmuch, path);
 
     try {
        notmuch->xapian_db = new Xapian::WritableDatabase (xapian_path,
@@ -488,8 +431,7 @@ notmuch_database_close (notmuch_database_t *notmuch)
 {
     delete notmuch->query_parser;
     delete notmuch->xapian_db;
-    free (notmuch->path);
-    free (notmuch);
+    talloc_free (notmuch);
 }
 
 const char *