From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 805076DE0350 for ; Sat, 2 Apr 2016 07:16:03 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.439 X-Spam-Level: X-Spam-Status: No, score=-0.439 tagged_above=-999 required=5 tests=[AWL=-0.439] 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 GzGQCae5TLHf for ; Sat, 2 Apr 2016 07:15:55 -0700 (PDT) Received: from che.mayfirst.org (che.mayfirst.org [209.234.253.108]) by arlo.cworth.org (Postfix) with ESMTP id B25CC6DE00DF for ; Sat, 2 Apr 2016 07:15:47 -0700 (PDT) Received: from fifthhorseman.net (dhcp-a244.meeting.ietf.org [31.133.162.68]) by che.mayfirst.org (Postfix) with ESMTPSA id 54B77F997 for ; Sat, 2 Apr 2016 10:15:45 -0400 (EDT) Received: by fifthhorseman.net (Postfix, from userid 1000) id B360220A0B; Sat, 2 Apr 2016 11:15:41 -0300 (BRT) From: Daniel Kahn Gillmor To: Notmuch Mail Subject: [PATCH v2 5/7] Introduce _notmuch_message_has_term() Date: Sat, 2 Apr 2016 11:15:39 -0300 Message-Id: <1459606541-23889-5-git-send-email-dkg@fifthhorseman.net> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1459606541-23889-1-git-send-email-dkg@fifthhorseman.net> References: <1459445693-3900-1-git-send-email-dkg@fifthhorseman.net> <1459606541-23889-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: Sat, 02 Apr 2016 14:16:03 -0000 It can be useful to easily tell if a given message has a given term associated with it. --- lib/message.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/notmuch-private.h | 13 +++++++++++++ 2 files changed, 62 insertions(+) diff --git a/lib/message.cc b/lib/message.cc index e414e9c..fab70fd 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -1216,6 +1216,55 @@ _notmuch_message_remove_term (notmuch_message_t *message, return NOTMUCH_PRIVATE_STATUS_SUCCESS; } +notmuch_bool_t +_notmuch_message_has_term (notmuch_message_t *message, + const char *prefix_name, + const char *value) +{ + notmuch_bool_t out; + notmuch_private_status_t st = + _notmuch_message_has_term_st (message, prefix_name, value, &out); + if (st) + return FALSE; + return out; +} + + +notmuch_private_status_t +_notmuch_message_has_term_st (notmuch_message_t *message, + const char *prefix_name, + const char *value, + notmuch_bool_t *result) +{ + char *term; + notmuch_bool_t out = FALSE; + notmuch_private_status_t status = NOTMUCH_PRIVATE_STATUS_SUCCESS; + + if (value == NULL) + return NOTMUCH_PRIVATE_STATUS_NULL_POINTER; + + term = talloc_asprintf (message, "%s%s", + _find_prefix (prefix_name), value); + + if (strlen (term) > NOTMUCH_TERM_MAX) + return NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG; + + try { + /* Look for the exact term */ + Xapian::TermIterator i = message->doc.termlist_begin (); + i.skip_to (term); + if (i != message->doc.termlist_end () && + !strcmp ((*i).c_str (), term)) + out = TRUE; + } catch (Xapian::Error &error) { + status = NOTMUCH_PRIVATE_STATUS_XAPIAN_EXCEPTION; + } + talloc_free (term); + + *result = out; + return status; +} + notmuch_status_t notmuch_message_add_tag (notmuch_message_t *message, const char *tag) { diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index cbfc144..00391a9 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -279,6 +279,19 @@ _notmuch_message_remove_term (notmuch_message_t *message, const char *prefix_name, const char *value); +/* _notmuch_message_has_term designed to be simple: if there is an + * error, it will return false */ +notmuch_bool_t +_notmuch_message_has_term (notmuch_message_t *message, + const char *prefix_name, + const char *value); + +notmuch_private_status_t +_notmuch_message_has_term_st (notmuch_message_t *message, + const char *prefix_name, + const char *value, + notmuch_bool_t *result); + notmuch_private_status_t _notmuch_message_gen_terms (notmuch_message_t *message, const char *prefix_name, -- 2.8.0.rc3