notmuch_database_open: Fix error message for file-not-found.
[notmuch] / database.cc
index 7ea1f4168fb42bea820e147a0bfed14654258364..a53651035d9febd791b56c5d2b631b9d4db96da7 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <xapian.h>
 
-#include <glib.h>
+#include <glib.h> /* g_strdup_printf, g_free, GHashTable */
 
 using namespace std;
 
@@ -379,24 +379,38 @@ parse_references (GPtrArray *array,
     }
 }
 
+char *
+notmuch_database_default_path (void)
+{
+    if (getenv ("NOTMUCH_BASE"))
+       return strdup (getenv ("NOTMUCH_BASE"));
+
+    return g_strdup_printf ("%s/mail", getenv ("HOME"));
+}
+
 notmuch_database_t *
 notmuch_database_create (const char *path)
 {
-    char *notmuch_path;
+    notmuch_database_t *notmuch = NULL;
+    char *notmuch_path = NULL;
     struct stat st;
     int err;
+    char *local_path = NULL;
+
+    if (path == NULL)
+       path = local_path = notmuch_database_default_path ();
 
     err = stat (path, &st);
     if (err) {
        fprintf (stderr, "Error: Cannot create database at %s: %s.\n",
                 path, strerror (errno));
-       return NULL;
+       goto DONE;
     }
 
     if (! S_ISDIR (st.st_mode)) {
        fprintf (stderr, "Error: Cannot create database at %s: Not a directory.\n",
                 path);
-       return NULL;
+       goto DONE;
     }
 
     notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch");
@@ -406,35 +420,42 @@ notmuch_database_create (const char *path)
     if (err) {
        fprintf (stderr, "Error: Cannot create directory %s: %s.\n",
                 notmuch_path, strerror (errno));
-       free (notmuch_path);
-       return NULL;
+       goto DONE;
     }
 
-    free (notmuch_path);
+    notmuch = notmuch_database_open (path);
+
+  DONE:
+    if (notmuch_path)
+       free (notmuch_path);
+    if (local_path)
+       free (local_path);
 
-    return notmuch_database_open (path);
+    return notmuch;
 }
 
 notmuch_database_t *
 notmuch_database_open (const char *path)
 {
-    notmuch_database_t *notmuch;
-    char *notmuch_path, *xapian_path;
+    notmuch_database_t *notmuch = NULL;
+    char *notmuch_path = NULL, *xapian_path = NULL;
     struct stat st;
     int err;
+    char *local_path = NULL;
+
+    if (path == NULL)
+       path = local_path = notmuch_database_default_path ();
 
     notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch");
 
     err = stat (notmuch_path, &st);
     if (err) {
-       fprintf (stderr, "Error: Cannot stat %s: %s\n",
-                notmuch_path, strerror (err));
-       free (notmuch_path);
-       return NULL;
+       fprintf (stderr, "Error opening database at %s: %s\n",
+                notmuch_path, strerror (errno));
+       goto DONE;
     }
 
     xapian_path = g_strdup_printf ("%s/%s", notmuch_path, "xapian");
-    free (notmuch_path);
 
     /* C++ is so nasty in requiring these casts. I'm almost tempted to
      * write a C wrapper for Xapian... */
@@ -449,7 +470,13 @@ notmuch_database_open (const char *path)
                 error.get_msg().c_str());
     }
     
-    free (xapian_path);
+  DONE:
+    if (local_path)
+       free (local_path);
+    if (notmuch_path)
+       free (notmuch_path);
+    if (xapian_path)
+       free (xapian_path);
 
     return notmuch;
 }
@@ -479,6 +506,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
     GPtrArray *parents, *thread_ids;
 
     const char *refs, *in_reply_to, *date, *header;
+    const char *from, *to, *subject;
     char *message_id;
 
     time_t time_value;
@@ -486,6 +514,15 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
 
     message = notmuch_message_open (filename);
 
+    notmuch_message_restrict_headers (message,
+                                     "date",
+                                     "from",
+                                     "in-reply-to",
+                                     "message-id",
+                                     "references",
+                                     "subject",
+                                     (char *) NULL);
+
     try {
        doc = Xapian::Document ();
 
@@ -554,15 +591,25 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
 
        free (message_id);
 
-/*
        date = notmuch_message_get_header (message, "date");
        time_value = notmuch_parse_date (date, NULL);
 
        doc.add_value (NOTMUCH_VALUE_DATE,
                       Xapian::sortable_serialise (time_value));
-*/
 
-       db->add_document (doc);
+       from = notmuch_message_get_header (message, "from");
+       subject = notmuch_message_get_header (message, "subject");
+       to = notmuch_message_get_header (message, "to");
+
+       if (from == NULL &&
+           subject == NULL &&
+           to == NULL)
+       {
+           notmuch_message_close (message);
+           return NOTMUCH_STATUS_FILE_NOT_EMAIL;
+       } else {
+           db->add_document (doc);
+       }
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred: %s.\n",
                 error.get_msg().c_str());