From 981b91e9405de2daf35d30d9bbeab0dd62b15683 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Fri, 9 Sep 2011 13:51:59 -0400 Subject: [PATCH] Add flush and reopen methods to the libnotmuch and to the python bindings. Flush allows read_write databases to commit their changes, forcing a flush to disk and reopen allows a read_only database to reread from the disk. Also added a handler for Xapian DatabaseChangedError which occurs when the flush happens to read only databases. --- bindings/python/notmuch/database.py | 10 ++++++++++ debian/libnotmuch1.symbols | 2 ++ lib/database.cc | 33 ++++++++++++++++++++++++++------- lib/notmuch.h | 8 ++++++++ 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py index f18ca14..b6c1c31 100644 --- a/bindings/python/notmuch/database.py +++ b/bindings/python/notmuch/database.py @@ -432,6 +432,16 @@ class Database(object): return Query(self, querystring) + def reopen(self): + """Reopens a read only database, when the data has changed, this is required.""" + if self._db is not None: + nmlib.notmuch_database_reopen(self._db) + + def flush(self): + """Flushes the search database, only available when in read-write.""" + if self._db is not None: + nmlib.notmuch_database_flush(self._db) + def __repr__(self): return "'Notmuch DB " + self.get_path() + "'" diff --git a/debian/libnotmuch1.symbols b/debian/libnotmuch1.symbols index 05d86e6..7e42b0e 100644 --- a/debian/libnotmuch1.symbols +++ b/debian/libnotmuch1.symbols @@ -3,6 +3,7 @@ libnotmuch.so.1 libnotmuch1 #MINVER# notmuch_database_close@Base 0.3 notmuch_database_create@Base 0.3 notmuch_database_find_message@Base 0.3 + notmuch_database_flush@Base 0.3 notmuch_database_get_all_tags@Base 0.3 notmuch_database_get_directory@Base 0.3 notmuch_database_get_path@Base 0.3 @@ -10,6 +11,7 @@ libnotmuch.so.1 libnotmuch1 #MINVER# notmuch_database_needs_upgrade@Base 0.3 notmuch_database_open@Base 0.3 notmuch_database_remove_message@Base 0.3 + notmuch_database_reopen@Base 0.3 notmuch_database_upgrade@Base 0.3 notmuch_directory_destroy@Base 0.3 notmuch_directory_get_child_directories@Base 0.3 diff --git a/lib/database.cc b/lib/database.cc index 9c2f4ec..b86bf1a 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -700,18 +700,37 @@ notmuch_database_open (const char *path, } void -notmuch_database_close (notmuch_database_t *notmuch) +notmuch_database_reopen (notmuch_database_t *notmuch) { try { - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE) - (static_cast (notmuch->xapian_db))->flush (); + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) + (static_cast (notmuch->xapian_db))->reopen(); } catch (const Xapian::Error &error) { - if (! notmuch->exception_reported) { - fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n", - error.get_msg().c_str()); - } + if (! notmuch->exception_reported) { + fprintf (stderr, "Error: A Xapian exception occurred reopening database: %s\n", + error.get_msg().c_str()); + } } +} +void +notmuch_database_flush (notmuch_database_t *notmuch) +{ + try { + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE) + (static_cast (notmuch->xapian_db))->flush(); + } catch (const Xapian::Error &error) { + if (! notmuch->exception_reported) { + fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n", + error.get_msg().c_str()); + } + } +} + +void +notmuch_database_close (notmuch_database_t *notmuch) +{ + notmuch_database_flush (notmuch); delete notmuch->term_gen; delete notmuch->query_parser; delete notmuch->xapian_db; diff --git a/lib/notmuch.h b/lib/notmuch.h index 974be8d..ca87b89 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -171,6 +171,14 @@ notmuch_database_t * notmuch_database_open (const char *path, notmuch_database_mode_t mode); +/* Reopen a read_only database when the data source has changed */ +void +notmuch_database_reopen (notmuch_database_t *database); + +/* Force a flush of the xapian database, also done on close */ +void +notmuch_database_flush (notmuch_database_t *database); + /* Close the given notmuch database, freeing all associated * resources. See notmuch_database_open. */ void -- 1.7.1