X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fopen.cc;h=8fc17cafaa939ac8b97b3a7c31f181304ef0d5f4;hb=e823d05ae6dc920d4fc9abf774c3d2575d891d7b;hp=cc099e51123eb5b5a37e3f4322dfc2d012122e04;hpb=1be79fff50729eb68d71b3a2c3500f6d0ba2807b;p=notmuch diff --git a/lib/open.cc b/lib/open.cc index cc099e51..8fc17caf 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -232,6 +232,56 @@ _alloc_notmuch () return notmuch; } +static notmuch_status_t +_trial_open (const char *xapian_path, char **message_ptr) +{ + try { + Xapian::Database db (xapian_path); + } catch (const Xapian::DatabaseOpeningError &error) { + IGNORE_RESULT (asprintf (message_ptr, + "Cannot open Xapian database at %s: %s\n", + xapian_path, + error.get_msg ().c_str ())); + return NOTMUCH_STATUS_PATH_ERROR; + } catch (const Xapian::Error &error) { + IGNORE_RESULT (asprintf (message_ptr, + "A Xapian exception occurred opening database: %s\n", + error.get_msg ().c_str ())); + return NOTMUCH_STATUS_XAPIAN_EXCEPTION; + } + return NOTMUCH_STATUS_SUCCESS; +} + +static notmuch_status_t +_choose_xapian_path (void *ctx, const char *database_path, const char **xapian_path, + char **message_ptr) +{ + notmuch_status_t status; + const char *trial_path, *notmuch_path; + + status = _db_dir_exists (database_path, message_ptr); + if (status) + goto DONE; + + trial_path = talloc_asprintf (ctx, "%s/xapian", database_path); + status = _trial_open (trial_path, message_ptr); + if (status != NOTMUCH_STATUS_PATH_ERROR) + goto DONE; + + notmuch_path = talloc_asprintf (ctx, "%s/.notmuch", database_path); + status = _db_dir_exists (notmuch_path, message_ptr); + if (status) + goto DONE; + + trial_path = talloc_asprintf (ctx, "%s/xapian", notmuch_path); + status = _trial_open (trial_path, message_ptr); + + DONE: + if (status == NOTMUCH_STATUS_SUCCESS) + *xapian_path = trial_path; + return status; +} + static void _set_database_path (notmuch_database_t *notmuch, const char *database_path) @@ -410,7 +460,6 @@ notmuch_database_open_with_config (const char *database_path, notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; void *local = talloc_new (NULL); notmuch_database_t *notmuch = NULL; - char *notmuch_path; char *message = NULL; GKeyFile *key_file = NULL; @@ -426,28 +475,16 @@ notmuch_database_open_with_config (const char *database_path, &message))) goto DONE; - _set_database_path (notmuch, database_path); - status = _db_dir_exists (database_path, &message); if (status) goto DONE; - if (! (notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"))) { - message = strdup ("Out of memory\n"); - status = NOTMUCH_STATUS_OUT_OF_MEMORY; - goto DONE; - } + _set_database_path (notmuch, database_path); - status = _db_dir_exists (notmuch_path, &message); + status = _choose_xapian_path (notmuch, database_path, ¬much->xapian_path, &message); if (status) goto DONE; - if (! (notmuch->xapian_path = talloc_asprintf (notmuch, "%s/%s", notmuch_path, "xapian"))) { - message = strdup ("Out of memory\n"); - status = NOTMUCH_STATUS_OUT_OF_MEMORY; - goto DONE; - } - status = _finish_open (notmuch, profile, mode, key_file, &message); DONE: @@ -550,12 +587,16 @@ notmuch_database_create_with_config (const char *database_path, goto DONE; } - /* XXX this reads the config file twice, which is a bit wasteful */ - status = notmuch_database_open_with_config (database_path, - NOTMUCH_DATABASE_MODE_READ_WRITE, - config_path, - profile, - ¬much, &message); + if (! (notmuch->xapian_path = talloc_asprintf (notmuch, "%s/%s", notmuch_path, "xapian"))) { + status = NOTMUCH_STATUS_OUT_OF_MEMORY; + goto DONE; + } + + status = _finish_open (notmuch, + profile, + NOTMUCH_DATABASE_MODE_READ_WRITE, + key_file, + &message); if (status) goto DONE;