diff --git a/lib/mu-store.cc b/lib/mu-store.cc index b12ab042..43c423d1 100644 --- a/lib/mu-store.cc +++ b/lib/mu-store.cc @@ -479,23 +479,20 @@ mu_store_new_readable (const char* xpath, GError **err) return reinterpret_cast(new Store (xpath)); } catch (const Mu::Error& me) { - if (me.code() == Mu::Error::Code::SchemaMismatch) - g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_NEEDS_REINDEX, - "read-only database @ %s needs (re)indexing", xpath); - else - g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN, - "error opening database @ %s: %s", xpath, me.what()); - // } catch (const Xapian::DatabaseNotFoundError& dbe) { // Xapian 1.4.10 - // g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_NEEDS_REINDEX, - // "database @ %s not found", xpath); - } catch (const Xapian::DatabaseOpeningError& dbe) { - g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_NEEDS_REINDEX, - "failed to open database @ %s", xpath); - } catch (...) { - g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN, - "error opening database @ %s", xpath); + if (me.code() == Mu::Error::Code::SchemaMismatch) { + g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_SCHEMA_MISMATCH, + "read-only database @ %s schema version does not match", + xpath); + return NULL; + } + } catch (const Xapian::Error& dbe) { + g_warning ("failed to open database @ %s: %s", xpath, + dbe.get_error_string() ? dbe.get_error_string() : "something went wrong"); } + g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_CANNOT_OPEN, + "failed to open database @ %s", xpath); + return NULL; } diff --git a/lib/utils/mu-util.h b/lib/utils/mu-util.h index d6ef31a4..0b07b8af 100644 --- a/lib/utils/mu-util.h +++ b/lib/utils/mu-util.h @@ -344,7 +344,10 @@ enum _MuError { MU_ERROR_XAPIAN_MODIFIED = 23, /* database was modified; reload */ MU_ERROR_XAPIAN_NEEDS_REINDEX = 24, - + /* database schema version doesn't match */ + MU_ERROR_XAPIAN_SCHEMA_MISMATCH = 25, + /* failed to open the database */ + MU_ERROR_XAPIAN_CANNOT_OPEN = 26, /* GMime related errors */ diff --git a/mu/mu-cmd.c b/mu/mu-cmd.c index 428bd592..e1c6f0dc 100644 --- a/mu/mu-cmd.c +++ b/mu/mu-cmd.c @@ -569,6 +569,33 @@ show_usage (void) typedef MuError (*store_func) (MuStore *, MuConfig *, GError **err); +static MuError +with_readonly_store (store_func func, MuConfig *opts, GError **err) +{ + MuError merr; + MuStore *store; + const char *path; + + if (opts->rebuild) { + g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR, + "cannot rebuild a read-only database"); + return MU_G_ERROR_CODE(err); + } + + path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB); + store = mu_store_new_readable (path, err); + + if (!store) + return MU_G_ERROR_CODE(err); + + merr = func (store, opts, err); + mu_store_unref (store); + + return merr; +} + + + static MuStore* get_store (MuConfig *opts, gboolean read_only, GError **err) { @@ -672,9 +699,10 @@ mu_cmd_execute (MuConfig *opts, GError **err) case MU_CONFIG_CMD_EXTRACT: merr = mu_cmd_extract (opts, err); break; case MU_CONFIG_CMD_CFIND: - merr = with_store (mu_cmd_cfind, opts, TRUE, err); break; + merr = with_readonly_store (mu_cmd_cfind, opts, err); break; case MU_CONFIG_CMD_FIND: - merr = with_store (mu_cmd_find, opts, TRUE, err); break; + merr = with_readonly_store (mu_cmd_find, opts, err); break; + case MU_CONFIG_CMD_INDEX: merr = with_store (mu_cmd_index, opts, FALSE, err); break; case MU_CONFIG_CMD_ADD: diff --git a/mu/mu.cc b/mu/mu.cc index 99f23bee..6fb1cc91 100644 --- a/mu/mu.cc +++ b/mu/mu.cc @@ -51,9 +51,13 @@ show_version (void) static void handle_error (MuConfig *conf, MuError merr, GError **err) { + const char *path; + if (!(err && *err)) return; + path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB); + switch ((*err)->code) { case MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK: g_printerr ("maybe mu is already running?\n"); @@ -71,6 +75,17 @@ handle_error (MuConfig *conf, MuError merr, GError **err) g_printerr ("see the mu manpage for commands, or " "'mu script' for the scripts\n"); break; + case MU_ERROR_XAPIAN_CANNOT_OPEN: + g_printerr("Failed to open database @ %s, \n" + "Please (re)build the database, i.e., with\n" + "\tmu index --rebuild\n", path); + return; + case MU_ERROR_XAPIAN_SCHEMA_MISMATCH: + g_printerr("Failed to open database @ %s, \n" + "because the schema version does not match mu's.\n\n" + "Please rebuild the database, i.e., with\n" + "\tmu index --rebuild\n", path); + return; default: break; /* nothing to do */ }