[PATCH 1/2] WIP: refactor tag search into library routine
authorDavid Bremner <david@tethera.net>
Thu, 30 Jun 2016 08:40:26 +0000 (10:40 +0200)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:22:09 +0000 (16:22 -0700)
5c/d6658e58290befafa09269adb584ced92c15a3 [new file with mode: 0644]

diff --git a/5c/d6658e58290befafa09269adb584ced92c15a3 b/5c/d6658e58290befafa09269adb584ced92c15a3
new file mode 100644 (file)
index 0000000..109e23d
--- /dev/null
@@ -0,0 +1,177 @@
+Return-Path: <bremner@tesseract.cs.unb.ca>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 211106DE01BA\r
+ for <notmuch@notmuchmail.org>; Thu, 30 Jun 2016 01:40:47 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.005\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.005 tagged_above=-999 required=5\r
+ tests=[AWL=-0.006, HEADER_FROM_DIFFERENT_DOMAINS=0.001]\r
+ autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id tkfA5gYg-LGq for <notmuch@notmuchmail.org>;\r
+ Thu, 30 Jun 2016 01:40:39 -0700 (PDT)\r
+Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197])\r
+ by arlo.cworth.org (Postfix) with ESMTPS id 156186DE00C9\r
+ for <notmuch@notmuchmail.org>; Thu, 30 Jun 2016 01:40:39 -0700 (PDT)\r
+Received: from remotemail by fethera.tethera.net with local (Exim 4.84)\r
+ (envelope-from <bremner@tesseract.cs.unb.ca>)\r
+ id 1bIXWF-0007e8-Sm; Thu, 30 Jun 2016 04:40:19 -0400\r
+Received: (nullmailer pid 30882 invoked by uid 1000);\r
+ Thu, 30 Jun 2016 08:40:30 -0000\r
+From: David Bremner <david@tethera.net>\r
+To: David Bremner <david@tethera.net>, notmuch@notmuchmail.org\r
+Subject: [PATCH 1/2] WIP: refactor tag search into library routine\r
+Date: Thu, 30 Jun 2016 10:40:26 +0200\r
+Message-Id: <1467276027-30633-2-git-send-email-david@tethera.net>\r
+X-Mailer: git-send-email 2.8.1\r
+In-Reply-To: <1467276027-30633-1-git-send-email-david@tethera.net>\r
+References: <87fustdsx9.fsf@zancas.localnet>\r
+ <1467276027-30633-1-git-send-email-david@tethera.net>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Thu, 30 Jun 2016 08:40:47 -0000\r
+\r
+---\r
+ lib/notmuch.h    | 13 +++++++++++++\r
+ lib/query.cc     | 35 +++++++++++++++++++++++++++++++++++\r
+ notmuch-search.c | 24 ++++--------------------\r
+ 3 files changed, 52 insertions(+), 20 deletions(-)\r
+\r
+diff --git a/lib/notmuch.h b/lib/notmuch.h\r
+index 2faa146..927ea3c 100644\r
+--- a/lib/notmuch.h\r
++++ b/lib/notmuch.h\r
+@@ -927,6 +927,19 @@ notmuch_messages_t *\r
+ notmuch_query_search_messages (notmuch_query_t *query);\r
\r
+ /**\r
++ * Execute a query for tags, outputing a notmuch_tags_t object\r
++ * which can be used to iterate over the results. The output\r
++ * tags object is owned by the query and as such, will only be\r
++ * valid until notmuch_query_destroy.\r
++ *\r
++ * @param[in] query   the query to collect tags for\r
++ * @param[out] out    the return tags list\r
++ *\r
++ */\r
++notmuch_status_t\r
++notmuch_query_search_tags (notmuch_query_t *query, notmuch_tags_t **out);\r
++\r
++/**\r
+  * Destroy a notmuch_query_t along with any associated resources.\r
+  *\r
+  * This will in turn destroy any notmuch_threads_t and\r
+diff --git a/lib/query.cc b/lib/query.cc\r
+index 7eb73a1..7245b12 100644\r
+--- a/lib/query.cc\r
++++ b/lib/query.cc\r
+@@ -310,6 +310,41 @@ _notmuch_query_search_documents (notmuch_query_t *query,\r
+     }\r
+ }\r
\r
++notmuch_status_t\r
++notmuch_query_search_tags  (notmuch_query_t *query, notmuch_tags_t **tags)\r
++{\r
++    notmuch_messages_t *messages = NULL;\r
++    notmuch_database_t *notmuch = notmuch_query_get_database (query);\r
++    notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;\r
++    const char *query_string = notmuch_query_get_query_string (query);\r
++\r
++    if (tags == NULL)\r
++      return NOTMUCH_STATUS_NULL_POINTER;\r
++\r
++    /* Special-case query of "*"  or '' for better performance. */\r
++    if (strcmp (query_string, "*") == 0 || *query_string == '\0') {\r
++      *tags = notmuch_database_get_all_tags (notmuch);\r
++      if (*tags == NULL)\r
++          status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;\r
++    } else {\r
++      notmuch_status_t status;\r
++      status = notmuch_query_search_messages_st (query, &messages);\r
++      if (status)\r
++          goto DONE;\r
++\r
++      *tags = notmuch_messages_collect_tags (messages);\r
++      talloc_steal (query, *tags);\r
++      if (*tags == NULL)\r
++          status = NOTMUCH_STATUS_OUT_OF_MEMORY;\r
++    }\r
++\r
++ DONE:\r
++    if (messages)\r
++      notmuch_messages_destroy (messages);\r
++\r
++    return status;\r
++}\r
++\r
+ notmuch_bool_t\r
+ _notmuch_mset_messages_valid (notmuch_messages_t *messages)\r
+ {\r
+diff --git a/notmuch-search.c b/notmuch-search.c\r
+index 8c65d5a..8722735 100644\r
+--- a/notmuch-search.c\r
++++ b/notmuch-search.c\r
+@@ -611,31 +611,18 @@ do_search_messages (search_context_t *ctx)\r
+     return 0;\r
+ }\r
\r
++\r
+ static int\r
+ do_search_tags (const search_context_t *ctx)\r
+ {\r
+-    notmuch_messages_t *messages = NULL;\r
+     notmuch_tags_t *tags;\r
+     const char *tag;\r
+     sprinter_t *format = ctx->format;\r
+     notmuch_query_t *query = ctx->query;\r
+-    notmuch_database_t *notmuch = ctx->notmuch;\r
+-\r
+-    /* should the following only special case if no excluded terms\r
+-     * specified? */\r
+-\r
+-    /* Special-case query of "*" for better performance. */\r
+-    if (strcmp (notmuch_query_get_query_string (query), "*") == 0) {\r
+-      tags = notmuch_database_get_all_tags (notmuch);\r
+-    } else {\r
+-      notmuch_status_t status;\r
+-      status = notmuch_query_search_messages_st (query, &messages);\r
+-      if (print_status_query ("notmuch search", query, status))\r
+-          return 1;\r
\r
+-      tags = notmuch_messages_collect_tags (messages);\r
+-    }\r
+-    if (tags == NULL)\r
++    if (print_status_query ("notmuch search",\r
++                          query,\r
++                          notmuch_query_search_tags (query, &tags)))\r
+       return 1;\r
\r
+     format->begin_list (format);\r
+@@ -653,9 +640,6 @@ do_search_tags (const search_context_t *ctx)\r
\r
+     notmuch_tags_destroy (tags);\r
\r
+-    if (messages)\r
+-      notmuch_messages_destroy (messages);\r
+-\r
+     format->end (format);\r
\r
+     return 0;\r
+-- \r
+2.8.1\r
+\r