In a split configuration, it does not make sense to have the extra .notmuch/ directory. Leave the xapian/ level of the path to allow the use of the top level e.g. as a place to store backups as is currently done by upgrade code in notmuch-new. --- lib/open.cc | 59 ++++++++++++++++++++++++++++------------ test/T055-path-config.sh | 9 ++++++ 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/lib/open.cc b/lib/open.cc index ede367af..91b24e38 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -8,6 +8,8 @@ #define DB_ACTION Xapian::DB_CREATE_OR_OPEN #endif +#define LOG_XAPIAN_EXCEPTION(message, error) IGNORE_RESULT (asprintf (&message, "A Xapian exception occurred opening database: %s\n", error.get_msg ().c_str ())); + notmuch_status_t notmuch_database_open (const char *path, notmuch_database_mode_t mode, @@ -154,7 +156,8 @@ 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, *xapian_path, *incompat_features; + const char *notmuch_path, *xapian_path; + char *incompat_features; char *message = NULL; struct stat st; int err; @@ -190,25 +193,41 @@ notmuch_database_open_with_config (const char *database_path, notmuch->writable_xapian_db = NULL; notmuch->atomic_nesting = 0; notmuch->view = 1; + notmuch->xapian_db = NULL; - if (! (notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"))) { - message = strdup ("Out of memory\n"); - status = NOTMUCH_STATUS_OUT_OF_MEMORY; + try { + xapian_path = talloc_asprintf (notmuch,"%s/xapian",database_path); + notmuch->xapian_db = new Xapian::Database (xapian_path); + } catch (const Xapian::DatabaseOpeningError &error) { + notmuch->xapian_db = NULL; + } catch (const Xapian::Error &error) { + LOG_XAPIAN_EXCEPTION (message, error); + notmuch_database_destroy (notmuch); + notmuch = NULL; + status = NOTMUCH_STATUS_XAPIAN_EXCEPTION; goto DONE; } - err = stat (notmuch_path, &st); - if (err) { - IGNORE_RESULT (asprintf (&message, "Error opening database at %s: %s\n", - notmuch_path, strerror (errno))); - status = NOTMUCH_STATUS_FILE_ERROR; - goto DONE; - } + if (! notmuch->xapian_db) { + 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; + } - if (! (xapian_path = talloc_asprintf (local, "%s/%s", notmuch_path, "xapian"))) { - message = strdup ("Out of memory\n"); - status = NOTMUCH_STATUS_OUT_OF_MEMORY; - goto DONE; + err = stat (notmuch_path, &st); + if (err) { + IGNORE_RESULT (asprintf (&message, "Error opening database at %s: %s\n", + notmuch_path, strerror (errno))); + status = NOTMUCH_STATUS_FILE_ERROR; + goto DONE; + } + + if (! (xapian_path = talloc_asprintf (local, "%s/%s", notmuch_path, "xapian"))) { + message = strdup ("Out of memory\n"); + status = NOTMUCH_STATUS_OUT_OF_MEMORY; + goto DONE; + } } try { @@ -216,11 +235,16 @@ notmuch_database_open_with_config (const char *database_path, std::string last_mod; if (mode == NOTMUCH_DATABASE_MODE_READ_WRITE) { + /* get rid of read only version opened above */ + if (notmuch->xapian_db) + delete notmuch->xapian_db; + notmuch->writable_xapian_db = new Xapian::WritableDatabase (xapian_path, DB_ACTION); notmuch->xapian_db = notmuch->writable_xapian_db; } else { - notmuch->xapian_db = new Xapian::Database (xapian_path); + if (! notmuch->xapian_db) + notmuch->xapian_db = new Xapian::Database (xapian_path); } /* Check version. As of database version 3, we represent @@ -318,8 +342,7 @@ notmuch_database_open_with_config (const char *database_path, goto DONE; } catch (const Xapian::Error &error) { - IGNORE_RESULT (asprintf (&message, "A Xapian exception occurred opening database: %s\n", - error.get_msg ().c_str ())); + LOG_XAPIAN_EXCEPTION (message, error); notmuch_database_destroy (notmuch); notmuch = NULL; status = NOTMUCH_STATUS_XAPIAN_EXCEPTION; diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh index 190b3686..72c369cb 100755 --- a/test/T055-path-config.sh +++ b/test/T055-path-config.sh @@ -40,4 +40,13 @@ output=$(notmuch count '*') test_expect_equal "$output" '52' restore_database +backup_database +test_begin_subtest "split (no prefix)" +notmuch config set database.path `pwd`/database +notmuch config set database.mail_root `pwd`/mail +mv mail/.notmuch/xapian database +output=$(notmuch count '*') +test_expect_equal "$output" '52' +restore_database + test_done -- 2.29.2 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-leave@notmuchmail.org