summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2021-02-16 20:08:23 -0400
committerDavid Bremner <david@tethera.net>2021-03-20 07:41:04 -0300
commit5ec6fd4dcfba0c50bcdec56b4ec51c2ccd1f2e92 (patch)
tree87541dc69c10fb92602b6ccaec4857158c1a8c61 /lib
parente823d05ae6dc920d4fc9abf774c3d2575d891d7b (diff)
lib/open: check for split configuration when creating database.
The main functionality will be tested when notmuch-new is converted to support split configuration. Here only the somewhat odd case of split mail root which is actually symlinked to the database path is tested.
Diffstat (limited to 'lib')
-rw-r--r--lib/open.cc53
1 files changed, 40 insertions, 13 deletions
diff --git a/lib/open.cc b/lib/open.cc
index 8fc17caf..0dfd295f 100644
--- a/lib/open.cc
+++ b/lib/open.cc
@@ -545,11 +545,12 @@ notmuch_database_create_with_config (const char *database_path,
{
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
notmuch_database_t *notmuch = NULL;
- char *notmuch_path = NULL;
+ const char *notmuch_path = NULL;
char *message = NULL;
GKeyFile *key_file = NULL;
void *local = talloc_new (NULL);
int err;
+ bool split = false;
_init_libs ();
@@ -571,20 +572,38 @@ notmuch_database_create_with_config (const char *database_path,
_set_database_path (notmuch, database_path);
- notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch");
+ if (key_file && ! split) {
+ char *mail_root = canonicalize_file_name (
+ g_key_file_get_value (key_file, "database", "mail_root", NULL));
+ char *db_path = canonicalize_file_name (database_path);
- err = mkdir (notmuch_path, 0755);
- if (err) {
- if (errno == EEXIST) {
- status = NOTMUCH_STATUS_DATABASE_EXISTS;
- talloc_free (notmuch);
- notmuch = NULL;
- } else {
- IGNORE_RESULT (asprintf (&message, "Error: Cannot create directory %s: %s.\n",
- notmuch_path, strerror (errno)));
- status = NOTMUCH_STATUS_FILE_ERROR;
+ split = (mail_root && (0 != strcmp (mail_root, db_path)));
+
+ free (mail_root);
+ free (db_path);
+ }
+
+ if (split) {
+ notmuch_path = database_path;
+ } else {
+ if (! (notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"))) {
+ status = NOTMUCH_STATUS_OUT_OF_MEMORY;
+ goto DONE;
+ }
+
+ err = mkdir (notmuch_path, 0755);
+ if (err) {
+ if (errno == EEXIST) {
+ status = NOTMUCH_STATUS_DATABASE_EXISTS;
+ talloc_free (notmuch);
+ notmuch = NULL;
+ } else {
+ IGNORE_RESULT (asprintf (&message, "Error: Cannot create directory %s: %s.\n",
+ notmuch_path, strerror (errno)));
+ status = NOTMUCH_STATUS_FILE_ERROR;
+ }
+ goto DONE;
}
- goto DONE;
}
if (! (notmuch->xapian_path = talloc_asprintf (notmuch, "%s/%s", notmuch_path, "xapian"))) {
@@ -592,6 +611,14 @@ notmuch_database_create_with_config (const char *database_path,
goto DONE;
}
+ status = _trial_open (notmuch->xapian_path, &message);
+ if (status == NOTMUCH_STATUS_SUCCESS) {
+ notmuch_database_destroy (notmuch);
+ notmuch = NULL;
+ status = NOTMUCH_STATUS_DATABASE_EXISTS;
+ goto DONE;
+ }
+
status = _finish_open (notmuch,
profile,
NOTMUCH_DATABASE_MODE_READ_WRITE,