summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2021-01-26 20:46:44 -0400
committerDavid Bremner <david@tethera.net>2021-03-20 07:21:26 -0300
commit1383481d4a7cee3b59f354a203090c966a2a635e (patch)
tree965dc5409a9ef69be32b7904075538b6e8ca13a9 /lib
parent793d4305d3563082761a59ac418ce827d00bdc39 (diff)
lib/open: allocate notmuch_t struct early
This gives more flexibility in restructuring the database opening code.
Diffstat (limited to 'lib')
-rw-r--r--lib/open.cc57
1 files changed, 36 insertions, 21 deletions
diff --git a/lib/open.cc b/lib/open.cc
index 6e46168a..8bd73d6a 100644
--- a/lib/open.cc
+++ b/lib/open.cc
@@ -192,6 +192,23 @@ _choose_database_path (void *ctx,
return NOTMUCH_STATUS_SUCCESS;
}
+notmuch_database_t *
+_alloc_notmuch ()
+{
+ notmuch_database_t *notmuch;
+
+ notmuch = talloc_zero (NULL, notmuch_database_t);
+ if (! notmuch)
+ return NULL;
+
+ notmuch->exception_reported = false;
+ notmuch->status_string = NULL;
+ notmuch->writable_xapian_db = NULL;
+ notmuch->atomic_nesting = 0;
+ notmuch->view = 1;
+ return notmuch;
+}
+
notmuch_status_t
notmuch_database_open_with_config (const char *database_path,
notmuch_database_mode_t mode,
@@ -211,9 +228,18 @@ notmuch_database_open_with_config (const char *database_path,
GKeyFile *key_file = NULL;
static int initialized = 0;
- if ((status = _choose_database_path (local, config_path, profile, &key_file, &database_path,
- &message)))
+ notmuch = _alloc_notmuch ();
+ if (! notmuch) {
+ status = NOTMUCH_STATUS_OUT_OF_MEMORY;
goto DONE;
+ }
+
+ if ((status = _choose_database_path (local, config_path, profile,
+ &key_file, &database_path, &message)))
+ goto DONE;
+
+ notmuch->path = talloc_strdup (notmuch, database_path);
+ strip_trailing (notmuch->path, '/');
if (! (notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"))) {
message = strdup ("Out of memory\n");
@@ -229,6 +255,12 @@ notmuch_database_open_with_config (const char *database_path,
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;
+ }
+
/* Initialize the GLib type system and threads */
#if ! GLIB_CHECK_VERSION (2, 35, 1)
g_type_init ();
@@ -240,23 +272,6 @@ notmuch_database_open_with_config (const char *database_path,
initialized = 1;
}
- notmuch = talloc_zero (NULL, notmuch_database_t);
- notmuch->exception_reported = false;
- notmuch->status_string = NULL;
- notmuch->path = talloc_strdup (notmuch, database_path);
-
- strip_trailing (notmuch->path, '/');
-
- notmuch->writable_xapian_db = NULL;
- notmuch->atomic_nesting = 0;
- notmuch->view = 1;
-
- 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;
- }
-
try {
std::string last_thread_id;
std::string last_mod;
@@ -442,8 +457,8 @@ notmuch_database_create_with_config (const char *database_path,
int err;
void *local = talloc_new (NULL);
- if ((status = _choose_database_path (local, config_path, profile, &key_file, &database_path,
- &message)))
+ if ((status = _choose_database_path (local, config_path, profile,
+ &key_file, &database_path, &message)))
goto DONE;
err = stat (database_path, &st);