]> git.cworth.org Git - notmuch/blobdiff - lib/open.cc
Merge branch 'release'
[notmuch] / lib / open.cc
index 5d80a884fb35aecbc6f084505ccb80ce85c8fec7..1ca69665c4e446ce4023b90713a86376c91310ee 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "database-private.h"
 #include "parse-time-vrp.h"
+#include "path-util.h"
 
 #if HAVE_XAPIAN_DB_RETRY_LOCK
 #define DB_ACTION (Xapian::DB_CREATE_OR_OPEN | Xapian::DB_RETRY_LOCK)
@@ -208,8 +209,25 @@ _choose_database_path (void *ctx,
        }
     }
     if (! *database_path) {
+       notmuch_status_t status;
+
        *database_path = _xdg_dir (ctx, "XDG_DATA_HOME", ".local/share", profile);
-       *split = true;
+       status = _db_dir_exists (*database_path, message);
+       if (status) {
+           *database_path = NULL;
+       } else {
+           *split = true;
+       }
+    }
+
+    if (! *database_path) {
+       notmuch_status_t status;
+
+       *database_path = talloc_asprintf (ctx, "%s/mail", getenv ("HOME"));
+       status = _db_dir_exists (*database_path, message);
+       if (status) {
+           *database_path = NULL;
+       }
     }
 
     if (*database_path == NULL) {
@@ -307,21 +325,34 @@ _set_database_path (notmuch_database_t *notmuch,
 }
 
 static void
-_init_libs ()
+_load_database_state (notmuch_database_t *notmuch)
 {
+    std::string last_thread_id;
+    std::string last_mod;
 
-    static int initialized = 0;
-
-    /* Initialize the GLib type system and threads */
-#if ! GLIB_CHECK_VERSION (2, 35, 1)
-    g_type_init ();
-#endif
+    notmuch->last_doc_id = notmuch->xapian_db->get_lastdocid ();
+    last_thread_id = notmuch->xapian_db->get_metadata ("last_thread_id");
+    if (last_thread_id.empty ()) {
+       notmuch->last_thread_id = 0;
+    } else {
+       const char *str;
+       char *end;
 
-    /* Initialize gmime */
-    if (! initialized) {
-       g_mime_init ();
-       initialized = 1;
+       str = last_thread_id.c_str ();
+       notmuch->last_thread_id = strtoull (str, &end, 16);
+       if (*end != '\0')
+           INTERNAL_ERROR ("Malformed database last_thread_id: %s", str);
     }
+
+    /* Get current highest revision number. */
+    last_mod = notmuch->xapian_db->get_value_upper_bound (
+       NOTMUCH_VALUE_LAST_MOD);
+    if (last_mod.empty ())
+       notmuch->revision = 0;
+    else
+       notmuch->revision = Xapian::sortable_unserialise (last_mod);
+    notmuch->uuid = talloc_strdup (
+       notmuch, notmuch->xapian_db->get_uuid ().c_str ());
 }
 
 static notmuch_status_t
@@ -338,8 +369,6 @@ _finish_open (notmuch_database_t *notmuch,
     const char *database_path = notmuch_database_get_path (notmuch);
 
     try {
-       std::string last_thread_id;
-       std::string last_mod;
 
        if (mode == NOTMUCH_DATABASE_MODE_READ_WRITE) {
            notmuch->writable_xapian_db = new Xapian::WritableDatabase (notmuch->xapian_path,
@@ -383,29 +412,7 @@ _finish_open (notmuch_database_t *notmuch,
            goto DONE;
        }
 
-       notmuch->last_doc_id = notmuch->xapian_db->get_lastdocid ();
-       last_thread_id = notmuch->xapian_db->get_metadata ("last_thread_id");
-       if (last_thread_id.empty ()) {
-           notmuch->last_thread_id = 0;
-       } else {
-           const char *str;
-           char *end;
-
-           str = last_thread_id.c_str ();
-           notmuch->last_thread_id = strtoull (str, &end, 16);
-           if (*end != '\0')
-               INTERNAL_ERROR ("Malformed database last_thread_id: %s", str);
-       }
-
-       /* Get current highest revision number. */
-       last_mod = notmuch->xapian_db->get_value_upper_bound (
-           NOTMUCH_VALUE_LAST_MOD);
-       if (last_mod.empty ())
-           notmuch->revision = 0;
-       else
-           notmuch->revision = Xapian::sortable_unserialise (last_mod);
-       notmuch->uuid = talloc_strdup (
-           notmuch, notmuch->xapian_db->get_uuid ().c_str ());
+       _load_database_state (notmuch);
 
        notmuch->query_parser = new Xapian::QueryParser;
        notmuch->term_gen = new Xapian::TermGenerator;
@@ -490,7 +497,7 @@ notmuch_database_open_with_config (const char *database_path,
     GKeyFile *key_file = NULL;
     bool split = false;
 
-    _init_libs ();
+    _notmuch_init ();
 
     notmuch = _alloc_notmuch ();
     if (! notmuch) {
@@ -587,7 +594,7 @@ notmuch_database_create_with_config (const char *database_path,
     int err;
     bool split = false;
 
-    _init_libs ();
+    _notmuch_init ();
 
     notmuch = _alloc_notmuch ();
     if (! notmuch) {
@@ -612,9 +619,9 @@ notmuch_database_create_with_config (const char *database_path,
     _set_database_path (notmuch, database_path);
 
     if (key_file && ! split) {
-       char *mail_root = canonicalize_file_name (
+       char *mail_root = notmuch_canonicalize_file_name (
            g_key_file_get_value (key_file, "database", "mail_root", NULL));
-       char *db_path = canonicalize_file_name (database_path);
+       char *db_path = notmuch_canonicalize_file_name (database_path);
 
        split = (mail_root && (0 != strcmp (mail_root, db_path)));
 
@@ -732,6 +739,8 @@ notmuch_database_reopen (notmuch_database_t *notmuch,
                                                           DB_ACTION);
            }
        }
+
+       _load_database_state (notmuch);
     } catch (const Xapian::Error &error) {
        if (! notmuch->exception_reported) {
            _notmuch_database_log (notmuch, "Error: A Xapian exception reopening database: %s\n",
@@ -781,7 +790,7 @@ notmuch_database_load_config (const char *database_path,
     GKeyFile *key_file = NULL;
     bool split = false;
 
-    _init_libs ();
+    _notmuch_init ();
 
     notmuch = _alloc_notmuch ();
     if (! notmuch) {