[PATCH 1/2] lib: add return status to database close and destroy
Jani Nikula
jani at nikula.org
Wed Dec 4 10:40:19 PST 2013
On Wed, 04 Dec 2013, Austin Clements <amdragon at MIT.EDU> wrote:
> Quoth Jani Nikula on Dec 01 at 3:13 pm:
>> notmuch_database_close may fail in Xapian ->flush() or ->close(), so
>> report the status. Similarly for notmuch_database_destroy which calls
>> close.
>>
>> This is required for notmuch insert to report error status if message
>> indexing failed.
>>
>> Bump the notmuch version to allow clients to conditional build against
>> both the current release and the next release (current git master).
>> ---
>> lib/database.cc | 18 ++++++++++++++----
>> lib/notmuch.h | 17 ++++++++++++++---
>> 2 files changed, 28 insertions(+), 7 deletions(-)
>>
>> diff --git a/lib/database.cc b/lib/database.cc
>> index f395061..98e2c31 100644
>> --- a/lib/database.cc
>> +++ b/lib/database.cc
>> @@ -767,14 +767,17 @@ notmuch_database_open (const char *path,
>> return status;
>> }
>>
>> -void
>> +notmuch_status_t
>> notmuch_database_close (notmuch_database_t *notmuch)
>> {
>> + notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
>> +
>> try {
>> if (notmuch->xapian_db != NULL &&
>> notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)
>> (static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->flush ();
>> } catch (const Xapian::Error &error) {
>> + status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
>> if (! notmuch->exception_reported) {
>> fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n",
>> error.get_msg().c_str());
>> @@ -789,6 +792,7 @@ notmuch_database_close (notmuch_database_t *notmuch)
>> notmuch->xapian_db->close();
>> } catch (const Xapian::Error &error) {
>> /* do nothing */
>> + status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
>> }
>> }
>>
>> @@ -802,6 +806,8 @@ notmuch_database_close (notmuch_database_t *notmuch)
>> notmuch->value_range_processor = NULL;
>> delete notmuch->date_range_processor;
>> notmuch->date_range_processor = NULL;
>> +
>> + return status;
>> }
>>
>> #if HAVE_XAPIAN_COMPACT
>> @@ -966,7 +972,7 @@ notmuch_database_compact (const char *path,
>>
>> DONE:
>> if (notmuch)
>> - notmuch_database_destroy (notmuch);
>> + ret = notmuch_database_destroy (notmuch);
>
> This will clobber the error code on most of the error paths. Maybe
> you want to only set ret if it's currently NOTMUCH_STATUS_SUCCESS?
Good point, will fix.
BR,
Jani.
>
>>
>> talloc_free (local);
>>
>> @@ -984,11 +990,15 @@ notmuch_database_compact (unused (const char *path),
>> }
>> #endif
>>
>> -void
>> +notmuch_status_t
>> notmuch_database_destroy (notmuch_database_t *notmuch)
>> {
>> - notmuch_database_close (notmuch);
>> + notmuch_status_t status;
>> +
>> + status = notmuch_database_close (notmuch);
>> talloc_free (notmuch);
>> +
>> + return status;
>> }
>>
>> const char *
>> diff --git a/lib/notmuch.h b/lib/notmuch.h
>> index 7c3a30c..dbdce86 100644
>> --- a/lib/notmuch.h
>> +++ b/lib/notmuch.h
>> @@ -42,7 +42,7 @@ NOTMUCH_BEGIN_DECLS
>> #endif
>>
>> #define NOTMUCH_MAJOR_VERSION 0
>> -#define NOTMUCH_MINOR_VERSION 17
>> +#define NOTMUCH_MINOR_VERSION 18
>> #define NOTMUCH_MICRO_VERSION 0
>
> This is actually what got me thinking about
> id:1386173986-9624-1-git-send-email-amdragon at mit.edu (which obviously
> conflicts). In particular, the Python bindings don't have access to
> these macros, and can only use the soname version. (I think the Go
> ones can use the macros; the Ruby ones certainly can.)
>
>>
>> /*
>> @@ -236,8 +236,16 @@ notmuch_database_open (const char *path,
>> *
>> * notmuch_database_close can be called multiple times. Later calls
>> * have no effect.
>> + *
>> + * Return value:
>> + *
>> + * NOTMUCH_STATUS_SUCCESS: Successfully closed the database.
>> + *
>> + * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred; the
>> + * database has been closed but there are no guarantees the
>> + * changes to the database, if any, have been flushed to disk.
>> */
>> -void
>> +notmuch_status_t
>> notmuch_database_close (notmuch_database_t *database);
>>
>> /* A callback invoked by notmuch_database_compact to notify the user
>> @@ -263,8 +271,11 @@ notmuch_database_compact (const char* path,
>>
>> /* Destroy the notmuch database, closing it if necessary and freeing
>> * all associated resources.
>> + *
>> + * Return value as in notmuch_database_close if the database was open;
>> + * notmuch_database_destroy itself has no failure modes.
>> */
>> -void
>> +notmuch_status_t
>> notmuch_database_destroy (notmuch_database_t *database);
>>
>> /* Return the database path of the given database.
>
> Regarding bindings (since you asked me to think about them), these
> should be a safe changes from an ABI perspective (though obviously the
> bindings will need changes to take advantage of the new return code).
More information about the notmuch
mailing list