From 0128d18c4a5c9c29203c18f35771ea293f25ba7f Mon Sep 17 00:00:00 2001 From: Daniel Kahn Gillmor Date: Wed, 20 Jan 2016 21:52:48 +1900 Subject: [PATCH] [PATCH v2 15/16] added notmuch_message_reindex --- 25/90baa3a0fc6cd7068fb8ceff20b28273072c68 | 190 ++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 25/90baa3a0fc6cd7068fb8ceff20b28273072c68 diff --git a/25/90baa3a0fc6cd7068fb8ceff20b28273072c68 b/25/90baa3a0fc6cd7068fb8ceff20b28273072c68 new file mode 100644 index 000000000..6ec977c1f --- /dev/null +++ b/25/90baa3a0fc6cd7068fb8ceff20b28273072c68 @@ -0,0 +1,190 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by arlo.cworth.org (Postfix) with ESMTP id 1533A6DE1BCA + for ; Tue, 19 Jan 2016 18:53:35 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: -0.022 +X-Spam-Level: +X-Spam-Status: No, score=-0.022 tagged_above=-999 required=5 + tests=[AWL=-0.022] autolearn=disabled +Received: from arlo.cworth.org ([127.0.0.1]) + by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id IGSIn38-4Bl8 for ; + Tue, 19 Jan 2016 18:53:33 -0800 (PST) +Received: from che.mayfirst.org (che.mayfirst.org [209.234.253.108]) + by arlo.cworth.org (Postfix) with ESMTP id 6127E6DE1A34 + for ; Tue, 19 Jan 2016 18:53:17 -0800 (PST) +Received: from fifthhorseman.net (unknown [38.109.115.130]) + by che.mayfirst.org (Postfix) with ESMTPSA id 60763F99F + for ; Tue, 19 Jan 2016 21:53:14 -0500 (EST) +Received: by fifthhorseman.net (Postfix, from userid 1000) + id 121F6208CC; Tue, 19 Jan 2016 18:53:11 -0800 (PST) +From: Daniel Kahn Gillmor +To: Notmuch Mail +Subject: [PATCH v2 15/16] added notmuch_message_reindex +Date: Tue, 19 Jan 2016 21:52:48 -0500 +Message-Id: <1453258369-7366-16-git-send-email-dkg@fifthhorseman.net> +X-Mailer: git-send-email 2.7.0.rc3 +In-Reply-To: <1453258369-7366-1-git-send-email-dkg@fifthhorseman.net> +References: <1453258369-7366-1-git-send-email-dkg@fifthhorseman.net> +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.20 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Wed, 20 Jan 2016 02:53:35 -0000 + +This new function asks the database to reindex a given message, using +the supplied indexopts. + +This can be used, for example, to index the cleartext of an encrypted +message. +--- + lib/message.cc | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + lib/notmuch.h | 14 +++++++++ + 2 files changed, 104 insertions(+), 1 deletion(-) + +diff --git a/lib/message.cc b/lib/message.cc +index 8d72ea2..3b35418 100644 +--- a/lib/message.cc ++++ b/lib/message.cc +@@ -529,7 +529,9 @@ static void + _notmuch_message_remove_terms (notmuch_message_t *message, const char *prefix) + { + Xapian::TermIterator i; +- size_t prefix_len = strlen (prefix); ++ size_t prefix_len = 0; ++ ++ prefix_len = strlen (prefix); + + while (1) { + i = message->doc.termlist_begin (); +@@ -1667,3 +1669,90 @@ _notmuch_message_database (notmuch_message_t *message) + { + return message->notmuch; + } ++ ++notmuch_status_t ++notmuch_message_reindex (notmuch_message_t *message, ++ notmuch_indexopts_t *indexopts) ++{ ++ notmuch_database_t *notmuch = NULL; ++ notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS, status; ++ notmuch_tags_t *tags = NULL; ++ notmuch_filenames_t *filenames, *orig_filenames = NULL; ++ const char *filename = NULL, *tag = NULL; ++ notmuch_message_t *newmsg = NULL; ++ notmuch_bool_t readded = FALSE, skip; ++ const char *autotags[] = { ++ "attachment", ++ "encrypted", ++ "signed", ++ "index-decrypted", ++ "index-decryption-failed" }; ++ ++ if (message == NULL) ++ return NOTMUCH_STATUS_NULL_POINTER; ++ ++ notmuch = _notmuch_message_database (message); ++ ++ /* cache tags and filenames */ ++ tags = notmuch_message_get_tags(message); ++ filenames = notmuch_message_get_filenames(message); ++ orig_filenames = notmuch_message_get_filenames(message); ++ ++ /* walk through filenames, removing them until the message is gone */ ++ for ( ; notmuch_filenames_valid (filenames); ++ notmuch_filenames_move_to_next (filenames)) { ++ filename = notmuch_filenames_get (filenames); ++ ++ ret = notmuch_database_remove_message (notmuch, filename); ++ if (ret != NOTMUCH_STATUS_SUCCESS && ++ ret != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) ++ return ret; ++ } ++ if (ret != NOTMUCH_STATUS_SUCCESS) ++ return ret; ++ ++ /* re-add the filenames with the associated indexopts */ ++ for (; notmuch_filenames_valid (orig_filenames); ++ notmuch_filenames_move_to_next (orig_filenames)) { ++ filename = notmuch_filenames_get (orig_filenames); ++ ++ status = notmuch_database_add_message_with_indexopts(notmuch, ++ filename, ++ indexopts, ++ readded ? NULL : &newmsg); ++ if (status == NOTMUCH_STATUS_SUCCESS || ++ status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) { ++ if (!readded) { ++ /* re-add tags */ ++ for (; notmuch_tags_valid (tags); ++ notmuch_tags_move_to_next (tags)) { ++ tag = notmuch_tags_get (tags); ++ skip = FALSE; ++ ++ for (size_t i = 0; i < ARRAY_SIZE(autotags); i++) ++ if (strcmp (tag, autotags[i]) == 0) ++ skip = TRUE; ++ ++ if (!skip) { ++ status = notmuch_message_add_tag (newmsg, tag); ++ if (status != NOTMUCH_STATUS_SUCCESS) ++ ret = status; ++ } ++ } ++ readded = TRUE; ++ } ++ } else { ++ /* if we failed to add this filename, go ahead and try the ++ * next one as though it were first, but report the ++ * error... */ ++ ret = status; ++ } ++ } ++ if (newmsg) ++ notmuch_message_destroy (newmsg); ++ ++ /* should we also destroy the incoming message object? at the ++ * moment, we leave that to the caller */ ++ return ret; ++} ++ +diff --git a/lib/notmuch.h b/lib/notmuch.h +index 854a451..e6287cd 100644 +--- a/lib/notmuch.h ++++ b/lib/notmuch.h +@@ -1377,6 +1377,20 @@ notmuch_filenames_t * + notmuch_message_get_filenames (notmuch_message_t *message); + + /** ++ * Re-index the e-mail corresponding to 'message' using the supplied index options ++ * ++ * Returns the status of the re-index operation. (see the return ++ * codes documented in notmuch_database_add_message) ++ * ++ * After reindexing, the user should discard the message object passed ++ * in here by calling notmuch_message_destroy, since it refers to the ++ * original message, not to the reindexed message. ++ */ ++notmuch_status_t ++notmuch_message_reindex (notmuch_message_t *message, ++ notmuch_indexopts_t *indexopts); ++ ++/** + * Message flags. + */ + typedef enum _notmuch_message_flag { +-- +2.7.0.rc3 + -- 2.26.2