notmuch_database_t **database,
char **error_message);
notmuch_status_t
+ notmuch_database_reopen (notmuch_database_t *database,
+ notmuch_database_mode_t new_mode);
+ notmuch_status_t
notmuch_database_close (notmuch_database_t *database);
notmuch_status_t
notmuch_database_destroy (notmuch_database_t *database);
raise errors.NotmuchError(ret)
self.closed = True
+ def reopen(self, mode=None):
+ """Reopen an opened notmuch database.
+
+ :param mode: Mode to reopen the database with. When None, the previously
+ active mode is preserved.
+ :type mode: :attr:`MODE`, str, or None.
+
+ This is useful e.g. for:
+ - switching the mode between read-only and read-write
+ - recovering from OperationInvalidatedError
+ """
+ if isinstance(mode, str):
+ try:
+ mode = self.STR_MODE_MAP[mode]
+ except KeyError:
+ raise ValueError('Invalid mode: %s' % mode)
+ else:
+ mode = mode or self.mode
+ self.mode = mode
+
+ ret = capi.lib.notmuch_database_reopen(self._db_p, mode.value)
+ if ret != capi.lib.NOTMUCH_STATUS_SUCCESS:
+ raise errors.NotmuchError(ret)
+
def __enter__(self):
return self
# XXX add tests for revisions comparisons
+
+class TestMode:
+
+ def test_readonly_raises(self, db, maildir):
+ with pytest.raises(errors.ReadOnlyDatabaseError):
+ with dbmod.Database(maildir.path, 'ro',
+ config=notmuch2.Database.CONFIG.EMPTY) as db_ro:
+ _, pathname = maildir.deliver()
+ db_ro.add(pathname)
+
+ def test_reopen_ro(self, db, maildir):
+ db.reopen(mode = dbmod.Mode.READ_ONLY)
+ with pytest.raises(errors.ReadOnlyDatabaseError):
+ _, pathname = maildir.deliver()
+ db.add(pathname)
+
+ def test_reopen_rw(self, db, maildir):
+ # release the write lock
+ db.close()
+
+ with dbmod.Database(maildir.path, 'ro',
+ config=notmuch2.Database.CONFIG.EMPTY) as db:
+ _, pathname = maildir.deliver()
+ db.reopen(mode = dbmod.Mode.READ_WRITE)
+ db.add(pathname)
+
class TestMessages:
def test_add_message(self, db, maildir):