X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fmessage.cc;h=1e325e23f69fba316f21deeb39cff0f7935e78fc;hp=e0b8a8e111925342e82d38d26ff8064b551915f0;hb=ceee152fca2be5cec9dd5873748539ff2642c91b;hpb=3ae12b1e286d1c0041a2e3957cb01daa2981dad9 diff --git a/lib/message.cc b/lib/message.cc index e0b8a8e1..1e325e23 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -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 (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; } @@ -401,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); @@ -543,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 (message->notmuch->xapian_db); db->replace_document (message->doc_id, message->doc); }