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 *