]> git.notmuchmail.org Git - notmuch/blobdiff - database.cc
Fix missing error check.
[notmuch] / database.cc
index 5049b47e9ef593d44b586bc67d37064f79dc0a84..1c0410c2c176a24f4897a33a70f945129c617aa9 100644 (file)
@@ -36,6 +36,8 @@ notmuch_status_to_string (notmuch_status_t status)
        return "No error occurred";
     case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
        return "A Xapian exception occurred";
+    case NOTMUCH_STATUS_FILE_ERROR:
+       return "Something went wrong trying to read or write a file";
     case NOTMUCH_STATUS_FILE_NOT_EMAIL:
        return "File is not an email";
     case NOTMUCH_STATUS_NULL_POINTER:
@@ -133,6 +135,29 @@ find_message_by_docid (Xapian::Database *db, Xapian::docid docid)
     return db->get_document (docid);
 }
 
+static void
+insert_thread_id (GHashTable *thread_ids, Xapian::Document doc)
+{
+    string value_string;
+    const char *value, *id, *comma;
+
+    value_string = doc.get_value (NOTMUCH_VALUE_THREAD);
+    value = value_string.c_str();
+    if (strlen (value)) {
+       id = value;
+       while (*id) {
+           comma = strchr (id, ',');
+           if (comma == NULL)
+               comma = id + strlen (id);
+           g_hash_table_insert (thread_ids,
+                                strndup (id, comma - id), NULL);
+           id = comma;
+           if (*id)
+               id++;
+       }
+    }
+}
+
 notmuch_message_t *
 notmuch_database_find_message (notmuch_database_t *notmuch,
                               const char *message_id)
@@ -174,16 +199,8 @@ find_thread_ids (notmuch_database_t *notmuch,
 
     find_messages_by_term (db, "ref", message_id, &child, &children_end);
     for ( ; child != children_end; child++) {
-       const char *thread_id;
        doc = find_message_by_docid (db, *child);
-
-       thread_id = doc.get_value (NOTMUCH_VALUE_THREAD).c_str ();
-       if (strlen (thread_id) == 0) {
-           fprintf (stderr, "Database error: Message with doc_id %u has empty thread-id value (value index %d)\n",
-                    *child, NOTMUCH_VALUE_THREAD);
-       } else {
-           g_hash_table_insert (thread_ids, strdup (thread_id), NULL);
-       }
+       insert_thread_id (thread_ids, doc);
     }
 
     for (i = 0; i < parents->len; i++) {
@@ -473,6 +490,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
     Xapian::WritableDatabase *db = notmuch->xapian_db;
     Xapian::Document doc;
     notmuch_message_file_t *message;
+    notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
 
     GPtrArray *parents, *thread_ids;
 
@@ -484,6 +502,10 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
     unsigned int i;
 
     message = notmuch_message_file_open (filename);
+    if (message == NULL) {
+       ret = NOTMUCH_STATUS_FILE_ERROR;
+       goto DONE;
+    }
 
     notmuch_message_file_restrict_headers (message,
                                           "date",
@@ -518,9 +540,18 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
            if (message_id == NULL)
                message_id = xstrdup (header);
        } else {
-           /* XXX: Should generate a message_id here, (such as a SHA1
-            * sum of the message itself) */
-           message_id = NULL;
+           /* No message-id at all, let's generate one by taking a
+            * hash over the file's contents. */
+           char *sha1 = notmuch_sha1_of_file (filename);
+
+           /* If that failed too, something is really wrong. Give up. */
+           if (sha1 == NULL) {
+               ret = NOTMUCH_STATUS_FILE_ERROR;
+               goto DONE;
+           }
+
+           message_id = g_strdup_printf ("notmuch-sha1-%s", sha1);
+           free (sha1);
        }
 
        thread_ids = find_thread_ids (notmuch, parents, message_id);
@@ -528,10 +559,11 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
        for (i = 0; i < parents->len; i++)
            g_free (g_ptr_array_index (parents, i));
        g_ptr_array_free (parents, TRUE);
-       if (message_id) {
-           add_term (doc, "msgid", message_id);
-           doc.add_value (NOTMUCH_VALUE_MESSAGE_ID, message_id);
-       }
+
+       add_term (doc, "msgid", message_id);
+       doc.add_value (NOTMUCH_VALUE_MESSAGE_ID, message_id);
+
+       free (message_id);
 
        if (thread_ids->len) {
            unsigned int i;
@@ -550,7 +582,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
            }
            doc.add_value (NOTMUCH_VALUE_THREAD, thread_id->str);
            g_string_free (thread_id, TRUE);
-       } else if (message_id) {
+       } else {
            /* If not part of any existing thread, generate a new thread_id. */
            thread_id_t thread_id;
 
@@ -561,8 +593,6 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
 
        g_ptr_array_free (thread_ids, TRUE);
 
-       free (message_id);
-
        date = notmuch_message_file_get_header (message, "date");
        time_value = notmuch_parse_date (date, NULL);
 
@@ -577,18 +607,21 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
            subject == NULL &&
            to == NULL)
        {
-           notmuch_message_file_close (message);
-           return NOTMUCH_STATUS_FILE_NOT_EMAIL;
+           ret = NOTMUCH_STATUS_FILE_NOT_EMAIL;
+           goto DONE;
        } else {
            db->add_document (doc);
        }
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred: %s.\n",
                 error.get_msg().c_str());
-       return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+       ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+       goto DONE;
     }
 
-    notmuch_message_file_close (message);
+  DONE:
+    if (message)
+       notmuch_message_file_close (message);
 
-    return NOTMUCH_STATUS_SUCCESS;
+    return ret;
 }