X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=lib%2Fdatabase.cc;h=7518968599f65fbeed8ac5285e15fb3cfb1cdc2e;hb=cbf9f890aab6a9fe6ce4fbe7f1a7903582ff5ff4;hp=b987cb420ec5892d52a8eaef94ca97aae8ed5bf7;hpb=c73d510f965cddf4cf45f9895c45fb818519e200;p=notmuch diff --git a/lib/database.cc b/lib/database.cc index b987cb42..75189685 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -69,6 +69,15 @@ _log_xapian_exception (const char *where, notmuch_database_t *notmuch, const Xa notmuch->exception_reported = true; } +notmuch_database_mode_t +_notmuch_database_mode (notmuch_database_t *notmuch) +{ + if (notmuch->writable_xapian_db) + return NOTMUCH_DATABASE_MODE_READ_WRITE; + else + return NOTMUCH_DATABASE_MODE_READ_ONLY; +} + /* Here's the current schema for our database (for NOTMUCH_DATABASE_VERSION): * * We currently have three different types of documents (mail, ghost, @@ -783,7 +792,7 @@ notmuch_database_create_verbose (const char *path, notmuch_status_t _notmuch_database_ensure_writable (notmuch_database_t *notmuch) { - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) { + if (_notmuch_database_mode (notmuch) == NOTMUCH_DATABASE_MODE_READ_ONLY) { _notmuch_database_log (notmuch, "Cannot write to a read-only database.\n"); return NOTMUCH_STATUS_READ_ONLY_DATABASE; } @@ -970,7 +979,7 @@ notmuch_database_open_verbose (const char *path, strip_trailing (notmuch->path, '/'); - notmuch->mode = mode; + notmuch->writable_xapian_db = NULL; notmuch->atomic_nesting = 0; notmuch->view = 1; try { @@ -978,8 +987,9 @@ notmuch_database_open_verbose (const char *path, string last_mod; if (mode == NOTMUCH_DATABASE_MODE_READ_WRITE) { - notmuch->xapian_db = new Xapian::WritableDatabase (xapian_path, - DB_ACTION); + notmuch->writable_xapian_db = new Xapian::WritableDatabase (xapian_path, + DB_ACTION); + notmuch->xapian_db = notmuch->writable_xapian_db; } else { notmuch->xapian_db = new Xapian::Database (xapian_path); } @@ -1107,10 +1117,9 @@ notmuch_database_close (notmuch_database_t *notmuch) * that transaction, or may discard committed (but * unflushed) transactions. To be certain, explicitly * cancel any outstanding transaction before closing. */ - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE && + if (_notmuch_database_mode (notmuch) == NOTMUCH_DATABASE_MODE_READ_WRITE && notmuch->atomic_nesting) - (static_cast (notmuch->xapian_db)) - ->cancel_transaction (); + notmuch->writable_xapian_db->cancel_transaction (); /* Close the database. This implicitly flushes * outstanding changes. */ @@ -1130,7 +1139,7 @@ notmuch_database_close (notmuch_database_t *notmuch) notmuch_status_t _notmuch_database_reopen (notmuch_database_t *notmuch) { - if (notmuch->mode != NOTMUCH_DATABASE_MODE_READ_ONLY) + if (_notmuch_database_mode (notmuch) != NOTMUCH_DATABASE_MODE_READ_ONLY) return NOTMUCH_STATUS_UNSUPPORTED_OPERATION; try { @@ -1395,7 +1404,7 @@ notmuch_database_needs_upgrade (notmuch_database_t *notmuch) { unsigned int version; - if (notmuch->mode != NOTMUCH_DATABASE_MODE_READ_WRITE) + if (_notmuch_database_mode (notmuch) != NOTMUCH_DATABASE_MODE_READ_WRITE) return FALSE; if (NOTMUCH_FEATURES_CURRENT & ~notmuch->features) @@ -1448,7 +1457,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch, if (status) return status; - db = static_cast (notmuch->xapian_db); + db = notmuch->writable_xapian_db; target_features = notmuch->features | NOTMUCH_FEATURES_CURRENT; new_features = NOTMUCH_FEATURES_CURRENT & ~notmuch->features; @@ -1697,7 +1706,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch, notmuch_status_t notmuch_database_begin_atomic (notmuch_database_t *notmuch) { - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY || + if (_notmuch_database_mode (notmuch) == NOTMUCH_DATABASE_MODE_READ_ONLY || notmuch->atomic_nesting > 0) goto DONE; @@ -1705,7 +1714,7 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch) return NOTMUCH_STATUS_UPGRADE_REQUIRED; try { - (static_cast (notmuch->xapian_db))->begin_transaction (false); + notmuch->writable_xapian_db->begin_transaction (false); } catch (const Xapian::Error &error) { _notmuch_database_log (notmuch, "A Xapian exception occurred beginning transaction: %s.\n", error.get_msg ().c_str ()); @@ -1726,11 +1735,11 @@ notmuch_database_end_atomic (notmuch_database_t *notmuch) if (notmuch->atomic_nesting == 0) return NOTMUCH_STATUS_UNBALANCED_ATOMIC; - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY || + if (_notmuch_database_mode (notmuch) == NOTMUCH_DATABASE_MODE_READ_ONLY || notmuch->atomic_nesting > 1) goto DONE; - db = static_cast (notmuch->xapian_db); + db = notmuch->writable_xapian_db; try { db->commit_transaction ();