]> git.notmuchmail.org Git - notmuch/blobdiff - lib/message.cc
add_message: Re-fix handling of non-mail files.
[notmuch] / lib / message.cc
index c3eb2e6ec9b618c77a119423c9ad98730d9c348b..e0b8a8e111925342e82d38d26ff8064b551915f0 100644 (file)
@@ -146,7 +146,7 @@ _notmuch_message_create (const void *talloc_owner,
 }
 
 /* Create a new notmuch_message_t object for a specific message ID,
- * (which may or may not already exist in the databas).
+ * (which may or may not already exist in the database).
  *
  * The 'notmuch' database will be the talloc owner of the returned
  * message.
@@ -285,7 +285,8 @@ _notmuch_message_get_in_reply_to (notmuch_message_t *message)
     i = message->doc.termlist_begin ();
     i.skip_to (prefix);
 
-    in_reply_to = *i;
+    if (i != message->doc.termlist_end ())
+       in_reply_to = *i;
 
     /* It's perfectly valid for a message to have no In-Reply-To
      * header. For these cases, we return an empty string. */
@@ -320,31 +321,39 @@ _notmuch_message_get_in_reply_to (notmuch_message_t *message)
 const char *
 notmuch_message_get_thread_id (notmuch_message_t *message)
 {
+    const char *prefix = _find_prefix ("thread");
     Xapian::TermIterator i;
+    std::string id;
+
+    /* This code is written with the assumption that "thread" has a
+     * single-character prefix. */
+    assert (strlen (prefix) == 1);
 
     if (message->thread_id)
        return message->thread_id;
 
     i = message->doc.termlist_begin ();
-    i.skip_to (_find_prefix ("thread"));
+    i.skip_to (prefix);
 
-    if (i == message->doc.termlist_end ())
+    if (i != message->doc.termlist_end ())
+       id = *i;
+
+    if (i == message->doc.termlist_end () || id[0] != *prefix)
        INTERNAL_ERROR ("Message with document ID of %d has no thread ID.\n",
                        message->doc_id);
 
-    message->thread_id = talloc_strdup (message, (*i).c_str () + 1);
+    message->thread_id = talloc_strdup (message, id.c_str () + 1);
 
 #if DEBUG_DATABASE_SANITY
     i++;
+    id = *i;
 
-    if (i != message->doc.termlist_end () &&
-       strncmp ((*i).c_str (), _find_prefix ("thread"),
-                strlen (_find_prefix ("thread"))) == 0)
+    if (i != message->doc.termlist_end () && id[0] == *prefix)
     {
        INTERNAL_ERROR ("Message %s has duplicate thread IDs: %s and %s\n",
                        notmuch_message_get_message_id (message),
                        message->thread_id,
-                       (*i).c_str () + 1);
+                       id.c_str () + 1);
     }
 #endif
 
@@ -458,7 +467,7 @@ notmuch_message_get_tags (notmuch_message_t *message)
 
     i.skip_to (prefix);
 
-    while (1) {
+    while (i != end) {
        tag = *i;
 
        if (tag.empty () || tag[0] != *prefix)
@@ -482,7 +491,7 @@ _notmuch_message_set_date (notmuch_message_t *message,
 
     /* GMime really doesn't want to see a NULL date, so protect its
      * sensibilities. */
-    if (date == NULL)
+    if (date == NULL || *date == '\0')
        time_value = 0;
     else
        time_value = g_mime_utils_header_decode_date (date, NULL);
@@ -539,6 +548,19 @@ _notmuch_message_sync (notmuch_message_t *message)
     db->replace_document (message->doc_id, message->doc);
 }
 
+/* Ensure that 'message' is not holding any file object open. Future
+ * calls to various functions will still automatically open the
+ * message file as needed.
+ */
+void
+_notmuch_message_close (notmuch_message_t *message)
+{
+    if (message->message_file) {
+       notmuch_message_file_close (message->message_file);
+       message->message_file = NULL;
+    }
+}
+
 /* Add a name:value term to 'message', (the actual term will be
  * encoded by prefixing the value with a short prefix). See
  * NORMAL_PREFIX and BOOLEAN_PREFIX arrays for the mapping of term