lib/open: factor out the second half of n_d_open_with_config

The idea is to allow reuse in n_d_create_with_config. This is
primarily code movement, with some changes in error messages to reduce
the number of input parameters.
This commit is contained in:
David Bremner 2021-01-30 13:57:32 -04:00
parent cba540d6f5
commit 1be79fff50

View file

@ -261,55 +261,18 @@ _init_libs ()
} }
} }
notmuch_status_t static notmuch_status_t
notmuch_database_open_with_config (const char *database_path, _finish_open (notmuch_database_t *notmuch,
notmuch_database_mode_t mode,
const char *config_path,
const char *profile, const char *profile,
notmuch_database_t **database, notmuch_database_mode_t mode,
char **status_string) GKeyFile *key_file,
char **message_ptr)
{ {
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
void *local = talloc_new (NULL); char *incompat_features;
notmuch_database_t *notmuch = NULL;
char *notmuch_path, *incompat_features;
char *message = NULL; char *message = NULL;
unsigned int version; unsigned int version;
GKeyFile *key_file = NULL; const char *database_path = notmuch_database_get_path (notmuch);
_init_libs ();
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;
_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;
}
status = _db_dir_exists (notmuch_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;
}
try { try {
std::string last_thread_id; std::string last_thread_id;
@ -332,7 +295,7 @@ notmuch_database_open_with_config (const char *database_path,
"Error: Notmuch database at %s\n" "Error: Notmuch database at %s\n"
" has a newer database format version (%u) than supported by this\n" " has a newer database format version (%u) than supported by this\n"
" version of notmuch (%u).\n", " version of notmuch (%u).\n",
notmuch_path, version, NOTMUCH_DATABASE_VERSION)); database_path, version, NOTMUCH_DATABASE_VERSION));
notmuch_database_destroy (notmuch); notmuch_database_destroy (notmuch);
notmuch = NULL; notmuch = NULL;
status = NOTMUCH_STATUS_FILE_ERROR; status = NOTMUCH_STATUS_FILE_ERROR;
@ -342,7 +305,7 @@ notmuch_database_open_with_config (const char *database_path,
/* Check features. */ /* Check features. */
incompat_features = NULL; incompat_features = NULL;
notmuch->features = _notmuch_database_parse_features ( notmuch->features = _notmuch_database_parse_features (
local, notmuch->xapian_db->get_metadata ("features").c_str (), notmuch, notmuch->xapian_db->get_metadata ("features").c_str (),
version, mode == NOTMUCH_DATABASE_MODE_READ_WRITE ? 'w' : 'r', version, mode == NOTMUCH_DATABASE_MODE_READ_WRITE ? 'w' : 'r',
&incompat_features); &incompat_features);
if (incompat_features) { if (incompat_features) {
@ -350,7 +313,7 @@ notmuch_database_open_with_config (const char *database_path,
"Error: Notmuch database at %s\n" "Error: Notmuch database at %s\n"
" requires features (%s)\n" " requires features (%s)\n"
" not supported by this version of notmuch.\n", " not supported by this version of notmuch.\n",
notmuch_path, incompat_features)); database_path, incompat_features));
notmuch_database_destroy (notmuch); notmuch_database_destroy (notmuch);
notmuch = NULL; notmuch = NULL;
status = NOTMUCH_STATUS_FILE_ERROR; status = NOTMUCH_STATUS_FILE_ERROR;
@ -430,6 +393,62 @@ notmuch_database_open_with_config (const char *database_path,
notmuch = NULL; notmuch = NULL;
status = NOTMUCH_STATUS_XAPIAN_EXCEPTION; status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
} }
DONE:
if (message_ptr)
*message_ptr = message;
return status;
}
notmuch_status_t
notmuch_database_open_with_config (const char *database_path,
notmuch_database_mode_t mode,
const char *config_path,
const char *profile,
notmuch_database_t **database,
char **status_string)
{
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;
_init_libs ();
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;
_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;
}
status = _db_dir_exists (notmuch_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: DONE:
talloc_free (local); talloc_free (local);