]> git.notmuchmail.org Git - notmuch/blobdiff - lib/message.cc
search : Extend "intial burst" optimization to return all results by chunks
[notmuch] / lib / message.cc
index 9488fb665ea18444bcc7670da991e0edcb91f5c1..1e325e23f69fba316f21deeb39cff0f7935e78fc 100644 (file)
@@ -168,9 +168,15 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch,
 {
     notmuch_message_t *message;
     Xapian::Document doc;
+    Xapian::WritableDatabase *db;
     unsigned int doc_id;
     char *term;
 
+    if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) {
+       *status_ret = NOTMUCH_PRIVATE_STATUS_READONLY_DATABASE;
+       return NULL;
+    }
+
     *status_ret = NOTMUCH_PRIVATE_STATUS_SUCCESS;
 
     message = notmuch_database_find_message (notmuch, message_id);
@@ -184,14 +190,18 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch,
        return NULL;
     }
 
+    db = static_cast<Xapian::WritableDatabase *> (notmuch->xapian_db);
     try {
        doc.add_term (term);
        talloc_free (term);
 
        doc.add_value (NOTMUCH_VALUE_MESSAGE_ID, message_id);
 
-       doc_id = notmuch->xapian_db->add_document (doc);
+       doc_id = db->add_document (doc);
     } catch (const Xapian::Error &error) {
+       fprintf (stderr, "A Xapian exception occurred creating message: %s\n",
+                error.get_msg().c_str());
+       notmuch->exception_reported = TRUE;
        *status_ret = NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
        return NULL;
     }
@@ -285,7 +295,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. */
@@ -332,10 +343,10 @@ notmuch_message_get_thread_id (notmuch_message_t *message)
        return message->thread_id;
 
     i = message->doc.termlist_begin ();
-
     i.skip_to (prefix);
 
-    id = *i;
+    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",
@@ -400,10 +411,14 @@ _notmuch_message_set_filename (notmuch_message_t *message,
     db_path = notmuch_database_get_path (message->notmuch);
     db_path_len = strlen (db_path);
 
-    if (*s == '/' && strncmp (s, db_path, db_path_len) == 0
-       && strlen (s) > db_path_len)
+    if (*s == '/' && strlen (s) > db_path_len
+       && strncmp (s, db_path, db_path_len) == 0)
     {
-       s += db_path_len + 1;
+       s += db_path_len;
+       while (*s == '/') s++;
+
+       if (!*s)
+               INTERNAL_ERROR ("Message filename was same as db prefix.");
     }
 
     message->doc.set_data (s);
@@ -466,7 +481,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)
@@ -490,7 +505,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);
@@ -542,8 +557,12 @@ _notmuch_message_ensure_thread_id (notmuch_message_t *message)
 void
 _notmuch_message_sync (notmuch_message_t *message)
 {
-    Xapian::WritableDatabase *db = message->notmuch->xapian_db;
+    Xapian::WritableDatabase *db;
+
+    if (message->notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY)
+       return;
 
+    db = static_cast <Xapian::WritableDatabase *> (message->notmuch->xapian_db);
     db->replace_document (message->doc_id, message->doc);
 }