diff options
| author | David Bremner <david@tethera.net> | 2021-02-07 12:54:45 -0400 |
|---|---|---|
| committer | David Bremner <david@tethera.net> | 2021-03-20 07:38:15 -0300 |
| commit | 986056bdbcfea642a2d08f7ee257f7aaaed433b9 (patch) | |
| tree | 12dc3eaf2e3cdfbe04c5b0738dab17bbb7de4c4f /lib/open.cc | |
| parent | aa59424812561f6d9e8c1d455d215349a90f676b (diff) | |
lib/open: Use check for existing database by trial opening
This is a bit heavyweight for now, but it will make more sense when we
check multiple locations for the Xapian database.
Diffstat (limited to 'lib/open.cc')
| -rw-r--r-- | lib/open.cc | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/lib/open.cc b/lib/open.cc index 09afd294..3bb3e103 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -232,6 +232,51 @@ _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; + + 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 +455,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 +470,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: |
