]> git.notmuchmail.org Git - notmuch/blobdiff - lib/database.cc
Split notmuch_database_close into two functions
[notmuch] / lib / database.cc
index c928d02bb147b039dae529be337dda8055a0b757..2fefcad7d163b5e9e40f9805a3d58b46a5704e37 100644 (file)
@@ -642,7 +642,7 @@ notmuch_database_open (const char *path,
                         "       read-write mode.\n",
                         notmuch_path, version, NOTMUCH_DATABASE_VERSION);
                notmuch->mode = NOTMUCH_DATABASE_MODE_READ_ONLY;
-               notmuch_database_close (notmuch);
+               notmuch_database_destroy (notmuch);
                notmuch = NULL;
                goto DONE;
            }
@@ -702,7 +702,7 @@ notmuch_database_open (const char *path,
     } catch (const Xapian::Error &error) {
        fprintf (stderr, "A Xapian exception occurred opening database: %s\n",
                 error.get_msg().c_str());
-       notmuch_database_close (notmuch);
+       notmuch_database_destroy (notmuch);
        notmuch = NULL;
     }
 
@@ -716,7 +716,8 @@ void
 notmuch_database_close (notmuch_database_t *notmuch)
 {
     try {
-       if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)
+       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) {
        if (! notmuch->exception_reported) {
@@ -725,10 +726,31 @@ notmuch_database_close (notmuch_database_t *notmuch)
        }
     }
 
+    /* Many Xapian objects (and thus notmuch objects) hold references to
+     * the database, so merely deleting the database may not suffice to
+     * close it.  Thus, we explicitly close it here. */
+    if (notmuch->xapian_db != NULL) {
+       try {
+           notmuch->xapian_db->close();
+       } catch (const Xapian::Error &error) {
+           /* do nothing */
+       }
+    }
+
     delete notmuch->term_gen;
+    notmuch->term_gen = NULL;
     delete notmuch->query_parser;
+    notmuch->query_parser = NULL;
     delete notmuch->xapian_db;
+    notmuch->xapian_db = NULL;
     delete notmuch->value_range_processor;
+    notmuch->value_range_processor = NULL;
+}
+
+void
+notmuch_database_destroy (notmuch_database_t *notmuch)
+{
+    notmuch_database_close (notmuch);
     talloc_free (notmuch);
 }
 
@@ -1813,6 +1835,9 @@ notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
     if (message_ret == NULL)
        return NOTMUCH_STATUS_NULL_POINTER;
 
+    /* return NULL on any failure */
+    *message_ret = NULL;
+
     local = talloc_new (notmuch);
 
     try {