}
/* 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.
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. */
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
i.skip_to (prefix);
- while (1) {
+ while (i != end) {
tag = *i;
if (tag.empty () || tag[0] != *prefix)
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