aboutsummaryrefslogtreecommitdiffhomepage
path: root/database.cc
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-10-20 09:56:25 -0700
committerGravatar Carl Worth <cworth@cworth.org>2009-10-20 09:58:40 -0700
commit55c8ee9a862f8f25be84adb591564b3777d88135 (patch)
treea59eb08ca8615a241c621404007f6d7a9f6c2cf2 /database.cc
parented6ee7330d28c65cb3990cbe4a5ac6182bf23402 (diff)
notmuch_database_create/open: Fix to handle NULL as documented.
When documenting these functions I described support for a NOTMUCH_BASE environment variable to be consulted in the case of a NULL path. Only, I had forgotten to actually write the code. This code exists now, with a new, exported function: notmuch_database_default_path
Diffstat (limited to 'database.cc')
-rw-r--r--database.cc53
1 files changed, 40 insertions, 13 deletions
diff --git a/database.cc b/database.cc
index 70f80f9f..528ae115 100644
--- a/database.cc
+++ b/database.cc
@@ -379,24 +379,38 @@ parse_references (GPtrArray *array,
}
}
+char *
+notmuch_database_default_path (void)
+{
+ if (getenv ("NOTMUCH_BASE"))
+ return strdup (getenv ("NOTMUCH_BASE"));
+
+ return g_strdup_printf ("%s/mail", getenv ("HOME"));
+}
+
notmuch_database_t *
notmuch_database_create (const char *path)
{
- char *notmuch_path;
+ notmuch_database_t *notmuch = NULL;
+ char *notmuch_path = NULL;
struct stat st;
int err;
+ char *local_path = NULL;
+
+ if (path == NULL)
+ path = local_path = notmuch_database_default_path ();
err = stat (path, &st);
if (err) {
fprintf (stderr, "Error: Cannot create database at %s: %s.\n",
path, strerror (errno));
- return NULL;
+ goto DONE;
}
if (! S_ISDIR (st.st_mode)) {
fprintf (stderr, "Error: Cannot create database at %s: Not a directory.\n",
path);
- return NULL;
+ goto DONE;
}
notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch");
@@ -406,22 +420,31 @@ notmuch_database_create (const char *path)
if (err) {
fprintf (stderr, "Error: Cannot create directory %s: %s.\n",
notmuch_path, strerror (errno));
- free (notmuch_path);
- return NULL;
+ goto DONE;
}
- free (notmuch_path);
+ notmuch = notmuch_database_open (path);
+
+ DONE:
+ if (notmuch_path)
+ free (notmuch_path);
+ if (local_path)
+ free (local_path);
- return notmuch_database_open (path);
+ return notmuch;
}
notmuch_database_t *
notmuch_database_open (const char *path)
{
- notmuch_database_t *notmuch;
- char *notmuch_path, *xapian_path;
+ notmuch_database_t *notmuch = NULL;
+ char *notmuch_path = NULL, *xapian_path = NULL;
struct stat st;
int err;
+ char *local_path = NULL;
+
+ if (path == NULL)
+ path = local_path = notmuch_database_default_path ();
notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch");
@@ -429,12 +452,10 @@ notmuch_database_open (const char *path)
if (err) {
fprintf (stderr, "Error: Cannot stat %s: %s\n",
notmuch_path, strerror (err));
- free (notmuch_path);
- return NULL;
+ goto DONE;
}
xapian_path = g_strdup_printf ("%s/%s", notmuch_path, "xapian");
- free (notmuch_path);
/* C++ is so nasty in requiring these casts. I'm almost tempted to
* write a C wrapper for Xapian... */
@@ -449,7 +470,13 @@ notmuch_database_open (const char *path)
error.get_msg().c_str());
}
- free (xapian_path);
+ DONE:
+ if (local_path)
+ free (local_path);
+ if (notmuch_path)
+ free (notmuch_path);
+ if (xapian_path)
+ free (xapian_path);
return notmuch;
}