mirror of https://github.com/djcb/mu.git
mu: better error handling for opening database read-only
Be a bit clearer for the user.
This commit is contained in:
parent
3fc2a5f3f8
commit
2575b2d0e3
|
@ -479,23 +479,20 @@ mu_store_new_readable (const char* xpath, GError **err)
|
||||||
return reinterpret_cast<MuStore*>(new Store (xpath));
|
return reinterpret_cast<MuStore*>(new Store (xpath));
|
||||||
|
|
||||||
} catch (const Mu::Error& me) {
|
} catch (const Mu::Error& me) {
|
||||||
if (me.code() == Mu::Error::Code::SchemaMismatch)
|
if (me.code() == Mu::Error::Code::SchemaMismatch) {
|
||||||
g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_NEEDS_REINDEX,
|
g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_SCHEMA_MISMATCH,
|
||||||
"read-only database @ %s needs (re)indexing", xpath);
|
"read-only database @ %s schema version does not match",
|
||||||
else
|
xpath);
|
||||||
g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN,
|
return NULL;
|
||||||
"error opening database @ %s: %s", xpath, me.what());
|
}
|
||||||
// } catch (const Xapian::DatabaseNotFoundError& dbe) { // Xapian 1.4.10
|
} catch (const Xapian::Error& dbe) {
|
||||||
// g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_NEEDS_REINDEX,
|
g_warning ("failed to open database @ %s: %s", xpath,
|
||||||
// "database @ %s not found", xpath);
|
dbe.get_error_string() ? dbe.get_error_string() : "something went wrong");
|
||||||
} 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR_XAPIAN_CANNOT_OPEN,
|
||||||
|
"failed to open database @ %s", xpath);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -344,7 +344,10 @@ enum _MuError {
|
||||||
MU_ERROR_XAPIAN_MODIFIED = 23,
|
MU_ERROR_XAPIAN_MODIFIED = 23,
|
||||||
/* database was modified; reload */
|
/* database was modified; reload */
|
||||||
MU_ERROR_XAPIAN_NEEDS_REINDEX = 24,
|
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 */
|
/* GMime related errors */
|
||||||
|
|
||||||
|
|
32
mu/mu-cmd.c
32
mu/mu-cmd.c
|
@ -569,6 +569,33 @@ show_usage (void)
|
||||||
typedef MuError (*store_func) (MuStore *, MuConfig *, GError **err);
|
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*
|
static MuStore*
|
||||||
get_store (MuConfig *opts, gboolean read_only, GError **err)
|
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_EXTRACT: merr = mu_cmd_extract (opts, err); break;
|
||||||
|
|
||||||
case MU_CONFIG_CMD_CFIND:
|
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:
|
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:
|
case MU_CONFIG_CMD_INDEX:
|
||||||
merr = with_store (mu_cmd_index, opts, FALSE, err); break;
|
merr = with_store (mu_cmd_index, opts, FALSE, err); break;
|
||||||
case MU_CONFIG_CMD_ADD:
|
case MU_CONFIG_CMD_ADD:
|
||||||
|
|
15
mu/mu.cc
15
mu/mu.cc
|
@ -51,9 +51,13 @@ show_version (void)
|
||||||
static void
|
static void
|
||||||
handle_error (MuConfig *conf, MuError merr, GError **err)
|
handle_error (MuConfig *conf, MuError merr, GError **err)
|
||||||
{
|
{
|
||||||
|
const char *path;
|
||||||
|
|
||||||
if (!(err && *err))
|
if (!(err && *err))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB);
|
||||||
|
|
||||||
switch ((*err)->code) {
|
switch ((*err)->code) {
|
||||||
case MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK:
|
case MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK:
|
||||||
g_printerr ("maybe mu is already running?\n");
|
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 "
|
g_printerr ("see the mu manpage for commands, or "
|
||||||
"'mu script' for the scripts\n");
|
"'mu script' for the scripts\n");
|
||||||
break;
|
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:
|
default:
|
||||||
break; /* nothing to do */
|
break; /* nothing to do */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue