lib/cli: Make notmuch_database_create return a status code

This is the notmuch_database_create equivalent of the previous change.

In this case, there were places where errors were not being propagated
correctly in notmuch_database_create or in calls to it.  These have
been fixed, using the new status value.
This commit is contained in:
Austin Clements 2012-04-30 12:25:34 -04:00 committed by David Bremner
parent 5fddc07dc3
commit ba57294218
3 changed files with 42 additions and 12 deletions

View file

@ -520,9 +520,10 @@ parse_references (void *ctx,
} }
} }
notmuch_database_t * notmuch_status_t
notmuch_database_create (const char *path) notmuch_database_create (const char *path, notmuch_database_t **database)
{ {
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
notmuch_database_t *notmuch = NULL; notmuch_database_t *notmuch = NULL;
char *notmuch_path = NULL; char *notmuch_path = NULL;
struct stat st; struct stat st;
@ -530,6 +531,7 @@ notmuch_database_create (const char *path)
if (path == NULL) { if (path == NULL) {
fprintf (stderr, "Error: Cannot create a database for a NULL path.\n"); fprintf (stderr, "Error: Cannot create a database for a NULL path.\n");
status = NOTMUCH_STATUS_NULL_POINTER;
goto DONE; goto DONE;
} }
@ -537,12 +539,14 @@ notmuch_database_create (const char *path)
if (err) { if (err) {
fprintf (stderr, "Error: Cannot create database at %s: %s.\n", fprintf (stderr, "Error: Cannot create database at %s: %s.\n",
path, strerror (errno)); path, strerror (errno));
status = NOTMUCH_STATUS_FILE_ERROR;
goto DONE; goto DONE;
} }
if (! S_ISDIR (st.st_mode)) { if (! S_ISDIR (st.st_mode)) {
fprintf (stderr, "Error: Cannot create database at %s: Not a directory.\n", fprintf (stderr, "Error: Cannot create database at %s: Not a directory.\n",
path); path);
status = NOTMUCH_STATUS_FILE_ERROR;
goto DONE; goto DONE;
} }
@ -553,19 +557,30 @@ notmuch_database_create (const char *path)
if (err) { if (err) {
fprintf (stderr, "Error: Cannot create directory %s: %s.\n", fprintf (stderr, "Error: Cannot create directory %s: %s.\n",
notmuch_path, strerror (errno)); notmuch_path, strerror (errno));
status = NOTMUCH_STATUS_FILE_ERROR;
goto DONE; goto DONE;
} }
notmuch_database_open (path, status = notmuch_database_open (path,
NOTMUCH_DATABASE_MODE_READ_WRITE, NOTMUCH_DATABASE_MODE_READ_WRITE,
&notmuch); &notmuch);
notmuch_database_upgrade (notmuch, NULL, NULL); if (status)
goto DONE;
status = notmuch_database_upgrade (notmuch, NULL, NULL);
if (status) {
notmuch_database_close(notmuch);
notmuch = NULL;
}
DONE: DONE:
if (notmuch_path) if (notmuch_path)
talloc_free (notmuch_path); talloc_free (notmuch_path);
return notmuch; if (database)
*database = notmuch;
else
talloc_free (notmuch);
return status;
} }
notmuch_status_t notmuch_status_t

View file

@ -140,11 +140,25 @@ typedef struct _notmuch_filenames notmuch_filenames_t;
* contained within 'path' can be added to the database by calling * contained within 'path' can be added to the database by calling
* notmuch_database_add_message. * notmuch_database_add_message.
* *
* In case of any failure, this function returns NULL, (after printing * In case of any failure, this function returns an error status and
* an error message on stderr). * sets *database to NULL (after printing an error message on stderr).
*
* Return value:
*
* NOTMUCH_STATUS_SUCCESS: Successfully created the database.
*
* NOTMUCH_STATUS_NULL_POINTER: The given 'path' argument is NULL.
*
* NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory.
*
* NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to create the
* database file (such as permission denied, or file not found,
* etc.), or the database already exists.
*
* NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred.
*/ */
notmuch_database_t * notmuch_status_t
notmuch_database_create (const char *path); notmuch_database_create (const char *path, notmuch_database_t **database);
typedef enum { typedef enum {
NOTMUCH_DATABASE_MODE_READ_ONLY = 0, NOTMUCH_DATABASE_MODE_READ_ONLY = 0,

View file

@ -900,7 +900,8 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
return 1; return 1;
printf ("Found %d total files (that's not much mail).\n", count); printf ("Found %d total files (that's not much mail).\n", count);
notmuch = notmuch_database_create (db_path); if (notmuch_database_create (db_path, &notmuch))
return 1;
add_files_state.total_files = count; add_files_state.total_files = count;
} else { } else {
if (notmuch_database_open (db_path, NOTMUCH_DATABASE_MODE_READ_WRITE, if (notmuch_database_open (db_path, NOTMUCH_DATABASE_MODE_READ_WRITE,