xapian-db: improve errors, fix warnings

This commit is contained in:
Dirk-Jan C. Binnema
2024-08-21 06:18:37 +03:00
parent c58eacc0d5
commit 407c6ed4d1
2 changed files with 19 additions and 15 deletions

View File

@ -51,12 +51,6 @@ XapianDb::read_only() const
return !std::holds_alternative<Xapian::WritableDatabase>(db_); return !std::holds_alternative<Xapian::WritableDatabase>(db_);
} }
const std::string&
XapianDb::path() const
{
return path_;
}
void void
XapianDb::set_timestamp(const std::string_view key) XapianDb::set_timestamp(const std::string_view key)
{ {
@ -102,8 +96,7 @@ make_db(const std::string& db_path, Flavor flavor)
XapianDb::XapianDb(const std::string& db_path, Flavor flavor): XapianDb::XapianDb(const std::string& db_path, Flavor flavor):
path_(make_path(db_path, flavor)), path_(make_path(db_path, flavor)),
db_(make_db(path_, flavor)), db_(make_db(path_, flavor)),
batch_size_{Config(*this).get<Config::Id::BatchSize>()} // default batch_size_{Config(*this).get<Config::Id::BatchSize>()/*default*/} {
{
if (flavor == Flavor::CreateOverwrite) if (flavor == Flavor::CreateOverwrite)
set_timestamp(MetadataIface::created_key); set_timestamp(MetadataIface::created_key);

View File

@ -50,6 +50,8 @@ template <typename Func> void
xapian_try(Func&& func) noexcept xapian_try(Func&& func) noexcept
try { try {
func(); func();
} catch (const Mu::Error& me) {
mu_critical("{}: mu error '{}'", __func__, me.what());
} catch (const Xapian::Error& xerr) { } catch (const Xapian::Error& xerr) {
mu_critical("{}: xapian error '{}'", __func__, xerr.get_msg()); mu_critical("{}: xapian error '{}'", __func__, xerr.get_msg());
} catch (const std::runtime_error& re) { } catch (const std::runtime_error& re) {
@ -64,6 +66,9 @@ template <typename Func, typename Default = std::invoke_result<Func>> auto
xapian_try(Func&& func, Default&& def) noexcept -> std::decay_t<decltype(func())> xapian_try(Func&& func, Default&& def) noexcept -> std::decay_t<decltype(func())>
try { try {
return func(); return func();
} catch (const Mu::Error& me) {
mu_critical("{}: mu error '{}'", __func__, me.what());
return static_cast<Default>(def);
} catch (const Xapian::DocNotFoundError& xerr) { } catch (const Xapian::DocNotFoundError& xerr) {
return static_cast<Default>(def); return static_cast<Default>(def);
} catch (const Xapian::Error& xerr) { } catch (const Xapian::Error& xerr) {
@ -84,6 +89,9 @@ template <typename Func> auto
xapian_try_result(Func&& func) noexcept -> std::decay_t<decltype(func())> xapian_try_result(Func&& func) noexcept -> std::decay_t<decltype(func())>
try { try {
return func(); return func();
} catch (const Mu::Error& me) {
return Err(std::move(me));
} catch (const Xapian::DatabaseNotFoundError& nferr) { } catch (const Xapian::DatabaseNotFoundError& nferr) {
return Err(Error{Error::Code::Xapian, "failed to open database"}. return Err(Error{Error::Code::Xapian, "failed to open database"}.
add_hint("Try (re)creating using `mu init'")); add_hint("Try (re)creating using `mu init'"));
@ -128,13 +136,13 @@ struct MetadataIface {
/// In-memory db /// In-memory db
struct MemDb: public MetadataIface { struct MemDb final: public MetadataIface {
/** /**
* Create a new memdb * Create a new memdb
* *
* @param readonly read-only? (for testing) * @param readonly read-only? (for testing)
*/ */
MemDb(bool readonly=false):read_only_{readonly} {} explicit MemDb(bool readonly=false):read_only_{readonly} {}
/** /**
* Set some metadata * Set some metadata
@ -188,7 +196,7 @@ private:
/** /**
* Fairly thin wrapper around Xapian::Database and Xapian::WritableDatabase * Fairly thin wrapper around Xapian::Database and Xapian::WritableDatabase
*/ */
class XapianDb: public MetadataIface { class XapianDb final: public MetadataIface {
public: public:
/** /**
* Type of database to create. * Type of database to create.
@ -211,8 +219,9 @@ public:
/** /**
* DTOR * DTOR
*/ */
~XapianDb() { ~XapianDb() override {
if (!read_only()) // shouldn't use read_only() here, since that's virtual.
if (std::holds_alternative<Xapian::WritableDatabase>(db_))
request_commit(true/*force*/); request_commit(true/*force*/);
mu_debug("closing db"); mu_debug("closing db");
} }
@ -237,7 +246,9 @@ public:
* *
* @return path to database * @return path to database
*/ */
const std::string& path() const; const std::string& path() const {
return path_;
}
/** /**
* Get a description of the Xapian database * Get a description of the Xapian database
@ -500,7 +511,7 @@ private:
Xapian::WritableDatabase& wdb(); Xapian::WritableDatabase& wdb();
std::string path_; std::string path_;
DbType db_; DbType db_;
size_t changes_{}; size_t changes_{};
bool in_transaction_{}; bool in_transaction_{};
size_t batch_size_; size_t batch_size_;