Catch and optionally print about exception at database->flush.
authorCarl Worth <cworth@cworth.org>
Sun, 22 Nov 2009 02:54:20 +0000 (03:54 +0100)
committerCarl Worth <cworth@cworth.org>
Sun, 22 Nov 2009 02:54:20 +0000 (03:54 +0100)
If an earlier exception occurred, then it's not unexpected for the
flush to fail as well. So in that case, we'll silently catch the
exception. Otherwise, make some noise about things going wrong at the
time of flush.

lib/database-private.h
lib/database.cc
lib/message.cc
lib/query.cc

index 79c7916a088da6ebd22c2d007da4ff7c9720088c..5f178f3ebc27b77882fc8f25669776fbbef838dd 100644 (file)
@@ -26,6 +26,7 @@
 #include <xapian.h>
 
 struct _notmuch_database {
+    notmuch_bool_t exception_reported;
     char *path;
     notmuch_database_mode_t mode;
     Xapian::Database *xapian_db;
index f3cac9109ecf67c253730ee95ef39448abcf4450..bcea88b029e7a097a7887c7570e5715e7a78fc76 100644 (file)
@@ -480,6 +480,7 @@ notmuch_database_open (const char *path,
     }
 
     notmuch = talloc (NULL, notmuch_database_t);
+    notmuch->exception_reported = FALSE;
     notmuch->path = talloc_strdup (notmuch, path);
 
     if (notmuch->path[strlen (notmuch->path) - 1] == '/')
@@ -530,8 +531,15 @@ notmuch_database_open (const char *path,
 void
 notmuch_database_close (notmuch_database_t *notmuch)
 {
-    if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)
-       (static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->flush ();
+    try {
+       if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)
+           (static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->flush ();
+    } catch (const Xapian::Error &error) {
+       if (! notmuch->exception_reported) {
+           fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n",
+                    error.get_msg().c_str());
+       }
+    }
 
     delete notmuch->term_gen;
     delete notmuch->query_parser;
@@ -611,6 +619,7 @@ notmuch_database_set_timestamp (notmuch_database_t *notmuch,
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred setting timestamp: %s.\n",
                 error.get_msg().c_str());
+       notmuch->exception_reported = TRUE;
        ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
     }
 
@@ -985,6 +994,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred adding message: %s.\n",
                 error.get_description().c_str());
+       notmuch->exception_reported = TRUE;
        ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
        goto DONE;
     }
index 4a5fae1e5901f584bdddcdd52bb9563aea585d5d..017c47b200cb81a6cca408134752c1d5d079f2dd 100644 (file)
@@ -201,6 +201,7 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch,
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred creating message: %s\n",
                 error.get_msg().c_str());
+       notmuch->exception_reported = TRUE;
        *status_ret = NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION;
        return NULL;
     }
index 4a686832dc4343e62a0c3e13fb2a244ccf45ae7f..86167352381e5ed22dd3177e1ce32d98c2b2559d 100644 (file)
@@ -152,6 +152,7 @@ notmuch_query_search_messages (notmuch_query_t *query,
        fprintf (stderr, "A Xapian exception occurred performing query: %s\n",
                 error.get_msg().c_str());
        fprintf (stderr, "Query string was: %s\n", query->query_string);
+       notmuch->exception_reported = TRUE;
     }
 
     return _notmuch_messages_create (message_list);