From f11aaa3678ab9d02d4ea98db1164772ed637404b Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Mon, 21 Dec 2009 15:14:32 -0800 Subject: [PATCH] database: Add new, public notmuch_database_remove_message This will allow applications to support the removal of messages, (such as when a file is deleted from the mail store). No removal support is provided yet in commands such as "notmuch new". --- lib/database.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/notmuch.h | 13 ++++++++++++ 2 files changed, 66 insertions(+) diff --git a/lib/database.cc b/lib/database.cc index cd3346fd..a3824956 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -1278,6 +1278,59 @@ notmuch_database_add_message (notmuch_database_t *notmuch, return ret; } +notmuch_status_t +notmuch_database_remove_message (notmuch_database_t *notmuch, + const char *filename) +{ + Xapian::WritableDatabase *db; + void *local = talloc_new (notmuch); + const char *direntry_prefix = _find_prefix ("direntry"); + char *direntry, *term; + Xapian::PostingIterator i, end; + Xapian::Document document; + notmuch_status_t status; + + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) { + fprintf (stderr, "Attempted to update a read-only database.\n"); + return NOTMUCH_STATUS_READONLY_DATABASE; + } + + db = static_cast (notmuch->xapian_db); + + status = _notmuch_database_filename_to_direntry (local, notmuch, + filename, &direntry); + if (status) + return status; + + term = talloc_asprintf (notmuch, "%s%s", direntry_prefix, direntry); + + find_doc_ids_for_term (notmuch, term, &i, &end); + + for ( ; i != end; i++) { + Xapian::TermIterator j; + + document = find_document_for_doc_id (notmuch, *i); + + document.remove_term (term); + + j = document.termlist_begin (); + j.skip_to (direntry_prefix); + + /* Was this the last direntry in the message? */ + if (j == document.termlist_end () || + strncmp ((*j).c_str (), direntry_prefix, strlen (direntry_prefix))) + { + db->delete_document (document.get_docid ()); + } else { + db->replace_document (document.get_docid (), document); + } + } + + talloc_free (local); + + return NOTMUCH_STATUS_SUCCESS; +} + notmuch_tags_t * _notmuch_convert_tags (void *ctx, Xapian::TermIterator &i, Xapian::TermIterator &end) diff --git a/lib/notmuch.h b/lib/notmuch.h index e96474f6..2e598656 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -267,6 +267,19 @@ notmuch_database_add_message (notmuch_database_t *database, const char *filename, notmuch_message_t **message); +/* Remove a message from the given notmuch database. + * + * Note that the only this particular filename association is removed + * from the database. If the same message (as determined by the + * message ID) is still available via other filenames, then the + * message will persist in the database for those filenames. When the + * last filename is removed for a particular message, the database + * content for that message will be entirely removed. + */ +notmuch_status_t +notmuch_database_remove_message (notmuch_database_t *database, + const char *filename); + /* Find a message with the given message_id. * * If the database contains a message with the given message_id, then