aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--lib/database.cc32
-rw-r--r--lib/message.cc21
-rw-r--r--lib/notmuch-private.h6
3 files changed, 43 insertions, 16 deletions
diff --git a/lib/database.cc b/lib/database.cc
index 553c9f82..3ed19772 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -734,6 +734,38 @@ _notmuch_database_get_directory_path (void *ctx,
return talloc_strdup (ctx, document.get_data ().c_str ());
}
+/* Given a legal 'filename' for the database, (either relative to
+ * database path or absolute with initial components identical to
+ * database path), return a new string (with 'ctx' as the talloc
+ * owner) suitable for use as a direntry term value.
+ */
+notmuch_status_t
+_notmuch_database_filename_to_direntry (void *ctx,
+ notmuch_database_t *notmuch,
+ const char *filename,
+ char **direntry)
+{
+ const char *relative, *directory, *basename;
+ Xapian::docid directory_id;
+ notmuch_status_t status;
+
+ relative = _notmuch_database_relative_path (notmuch, filename);
+
+ status = _notmuch_database_split_path (ctx, relative,
+ &directory, &basename);
+ if (status)
+ return status;
+
+ status = _notmuch_database_find_directory_id (notmuch, directory,
+ &directory_id);
+ if (status)
+ return status;
+
+ *direntry = talloc_asprintf (ctx, "%u:%s", directory_id, basename);
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
/* Given a legal 'path' for the database, return the relative path.
*
* The return value will be a pointer to the originl path contents,
diff --git a/lib/message.cc b/lib/message.cc
index 7d586903..bd179519 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -393,11 +393,9 @@ notmuch_status_t
_notmuch_message_add_filename (notmuch_message_t *message,
const char *filename)
{
- const char *relative, *directory, *basename;
- char *term;
- Xapian::docid directory_id;
notmuch_status_t status;
void *local = talloc_new (message);
+ char *direntry;
if (message->filename) {
talloc_free (message->filename);
@@ -407,22 +405,13 @@ _notmuch_message_add_filename (notmuch_message_t *message,
if (filename == NULL)
INTERNAL_ERROR ("Message filename cannot be NULL.");
- relative = _notmuch_database_relative_path (message->notmuch, filename);
-
- status = _notmuch_database_split_path (local, relative,
- &directory, &basename);
+ status = _notmuch_database_filename_to_direntry (local,
+ message->notmuch,
+ filename, &direntry);
if (status)
return status;
- status = _notmuch_database_find_directory_id (message->notmuch, directory,
- &directory_id);
- if (status)
- return status;
-
- term = talloc_asprintf (local, "%s%u:%s",
- _find_prefix ("direntry"), directory_id, basename);
-
- message->doc.add_term (term);
+ _notmuch_message_add_term (message, "direntry", direntry);
talloc_free (local);
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index e9712832..cb93c397 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -171,6 +171,12 @@ _notmuch_database_get_directory_path (void *ctx,
notmuch_database_t *notmuch,
unsigned int doc_id);
+notmuch_status_t
+_notmuch_database_filename_to_direntry (void *ctx,
+ notmuch_database_t *notmuch,
+ const char *filename,
+ char **direntry);
+
/* thread.cc */
notmuch_thread_t *