The main expected use is to recover from a Xapian::DatabaseChanged exception. --- lib/database.cc | 19 +++++++++++++++++++ lib/notmuch.h | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/database.cc b/lib/database.cc index 386dcd17..9c4be516 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -1133,6 +1133,25 @@ notmuch_database_close (notmuch_database_t *notmuch) return status; } +notmuch_status_t +notmuch_database_reopen (notmuch_database_t *notmuch) +{ + if (notmuch->mode != NOTMUCH_DATABASE_MODE_READ_ONLY) + return NOTMUCH_STATUS_UNSUPPORTED_OPERATION; + + try { + notmuch->xapian_db->reopen (); + } catch (const Xapian::Error &error) { + if (! notmuch->exception_reported) { + _notmuch_database_log (notmuch, "Error: A Xapian exception reopening database: %s\n", + error.get_msg ().c_str ()); + notmuch->exception_reported = TRUE; + return NOTMUCH_STATUS_XAPIAN_EXCEPTION; + } + } + return NOTMUCH_STATUS_SUCCESS; +} + static int unlink_cb (const char *path, unused (const struct stat *sb), diff --git a/lib/notmuch.h b/lib/notmuch.h index 16da8be9..e9ed01dd 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -363,6 +363,18 @@ notmuch_status_t notmuch_database_close (notmuch_database_t *database); /** + * Reopen a (read-only) database, synching the database view with that + * on disk. + * + * @returns + * - NOTMUCH_STATUS_UNSUPPORTED_OPERATION: database is not read only + * - NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occured trying to + * re-open the database. + */ +notmuch_status_t +notmuch_database_reopen (notmuch_database_t *database); + +/** * A callback invoked by notmuch_database_compact to notify the user * of the progress of the compaction process. */ -- 2.11.0