lib/open: allocate notmuch_t struct early

This gives more flexibility in restructuring the database opening
code.
This commit is contained in:
David Bremner 2021-01-26 20:46:44 -04:00
parent 793d4305d3
commit 1383481d4a

View file

@ -192,6 +192,23 @@ _choose_database_path (void *ctx,
return NOTMUCH_STATUS_SUCCESS; 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_status_t
notmuch_database_open_with_config (const char *database_path, notmuch_database_open_with_config (const char *database_path,
notmuch_database_mode_t mode, notmuch_database_mode_t mode,
@ -211,9 +228,18 @@ notmuch_database_open_with_config (const char *database_path,
GKeyFile *key_file = NULL; GKeyFile *key_file = NULL;
static int initialized = 0; static int initialized = 0;
if ((status = _choose_database_path (local, config_path, profile, &key_file, &database_path, notmuch = _alloc_notmuch ();
&message))) if (! notmuch) {
status = NOTMUCH_STATUS_OUT_OF_MEMORY;
goto DONE; 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"))) { if (! (notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"))) {
message = strdup ("Out of memory\n"); message = strdup ("Out of memory\n");
@ -229,6 +255,12 @@ notmuch_database_open_with_config (const char *database_path,
goto DONE; 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 */ /* Initialize the GLib type system and threads */
#if ! GLIB_CHECK_VERSION (2, 35, 1) #if ! GLIB_CHECK_VERSION (2, 35, 1)
g_type_init (); g_type_init ();
@ -240,23 +272,6 @@ notmuch_database_open_with_config (const char *database_path,
initialized = 1; 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 { try {
std::string last_thread_id; std::string last_thread_id;
std::string last_mod; std::string last_mod;
@ -442,8 +457,8 @@ notmuch_database_create_with_config (const char *database_path,
int err; int err;
void *local = talloc_new (NULL); void *local = talloc_new (NULL);
if ((status = _choose_database_path (local, config_path, profile, &key_file, &database_path, if ((status = _choose_database_path (local, config_path, profile,
&message))) &key_file, &database_path, &message)))
goto DONE; goto DONE;
err = stat (database_path, &st); err = stat (database_path, &st);