On Fri, 24 Feb 2017, David Bremner <david@tethera.net> wrote: > The main expected use is to recover from a Xapian::DatabaseChanged > exception. I guess the main question here is if this should be exposed from the library or not. If the intention is to recover *within* the library, why add new API? > --- > lib/database-private.h | 4 ++++ > lib/database.cc | 23 +++++++++++++++++++++++ > lib/notmuch.h | 12 ++++++++++++ > 3 files changed, 39 insertions(+) > > diff --git a/lib/database-private.h b/lib/database-private.h > index 2fb60f5e..06882439 100644 > --- a/lib/database-private.h > +++ b/lib/database-private.h > @@ -207,6 +207,10 @@ struct _notmuch_database { > unsigned long revision; > const char *uuid; > > + /* Keep track of the number of times the database has been re-opened > + * (or other global invalidations of notmuch's caching) > + */ > + unsigned long view; > Xapian::QueryParser *query_parser; > Xapian::TermGenerator *term_gen; > Xapian::ValueRangeProcessor *value_range_processor; > diff --git a/lib/database.cc b/lib/database.cc > index 386dcd17..1e958b65 100644 > --- a/lib/database.cc > +++ b/lib/database.cc > @@ -951,6 +951,7 @@ notmuch_database_open_verbose (const char *path, > > notmuch->mode = mode; > notmuch->atomic_nesting = 0; > + notmuch->view = 1; > try { > string last_thread_id; > string last_mod; > @@ -1133,6 +1134,28 @@ 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; > + } Move the above return out of the if block? > + } > + > + notmuch->view++; > + > + 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 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > https://notmuchmail.org/mailman/listinfo/notmuch