Re: Python bindings and Xapian exceptions
authorMatt <mattator@gmail.com>
Thu, 18 Dec 2014 21:10:26 +0000 (22:10 +0100)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 21:47:01 +0000 (14:47 -0700)
0f/149a7f622c9ac50e739834c9723529c17d8995 [new file with mode: 0644]

diff --git a/0f/149a7f622c9ac50e739834c9723529c17d8995 b/0f/149a7f622c9ac50e739834c9723529c17d8995
new file mode 100644 (file)
index 0000000..4366f92
--- /dev/null
@@ -0,0 +1,210 @@
+Return-Path: <mattator@gmail.com>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id B1D23431FC7\r
+       for <notmuch@notmuchmail.org>; Thu, 18 Dec 2014 13:10:30 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.799\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.799 tagged_above=-999 required=5\r
+       tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1,\r
+       FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id ZDBroLNwqWOw for <notmuch@notmuchmail.org>;\r
+       Thu, 18 Dec 2014 13:10:27 -0800 (PST)\r
+Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com\r
+       [209.85.216.43]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id 62734431FD6\r
+       for <notmuch@notmuchmail.org>; Thu, 18 Dec 2014 13:10:27 -0800 (PST)\r
+Received: by mail-qa0-f43.google.com with SMTP id x12so1390790qac.2\r
+       for <notmuch@notmuchmail.org>; Thu, 18 Dec 2014 13:10:26 -0800 (PST)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;\r
+       h=mime-version:in-reply-to:references:date:message-id:subject:from:to\r
+       :cc:content-type;\r
+       bh=IyLrC/NcMV8LYUuwj0Vj1Re95F1n2cBmqjQuFmcmLRg=;\r
+       b=Yi4XWadQDqY+ijh77nB6ghbWTivpmH+M1JHB6pT89usy27kNC95Rf5pkc1Txvw7uLJ\r
+       c184XYp/qeZ+B4Sf+OP9C2l/H2OsPfiJXb9DvsAFvxm6BbiSmpzTj9nKx83ytX3K+R1I\r
+       NquT5I8AAbezEYgP2DU6xpscNASzQawU3rvcIhLcEU+FcBkrCoZnxguS1ktBrPnVyPAS\r
+       BYEvLEKaCz7Gkt+hShVPZeBooFW5sFQiK5plHyiy1c8Gkx0/z2HobCKdFUITKbq+2CBx\r
+       HbC/M2JRNAWdAM9TCj6OoyNsaGXQWHc+K7ZC5w9uTpHBho8M/2lKy5erSaOtoCOeyi5k\r
+       Fyjg==\r
+MIME-Version: 1.0\r
+X-Received: by 10.224.172.4 with SMTP id j4mr7788637qaz.58.1418937026639; Thu,\r
+       18 Dec 2014 13:10:26 -0800 (PST)\r
+Received: by 10.96.77.105 with HTTP; Thu, 18 Dec 2014 13:10:26 -0800 (PST)\r
+In-Reply-To: <87fvcg6n06.fsf@maritornes.cs.unb.ca>\r
+References: <87k4q7s43v.fsf@ut.hh.sledj.net> <878w6gis5g.fsf@SSpaeth.de>\r
+       <871v70ril7.fsf@yoom.home.cworth.org> <871v70z0y5.fsf@SSpaeth.de>\r
+       <loom.20141215T121709-488@post.gmane.org>\r
+       <87iohc7iiz.fsf@maritornes.cs.unb.ca>\r
+       <CADHp1NyiuG-V2b68fsie_Fhn0kigUM88bPinhE9yZPCsWNW6QA@mail.gmail.com>\r
+       <87fvcg6n06.fsf@maritornes.cs.unb.ca>\r
+Date: Thu, 18 Dec 2014 22:10:26 +0100\r
+Message-ID:\r
+ <CADHp1NzcmMxiMN=EVpjWBfWFahve7-Ubruoi6_UOpF+Crj8bfw@mail.gmail.com>\r
+Subject: Re: Python bindings and Xapian exceptions\r
+From: Matt <mattator@gmail.com>\r
+To: David Bremner <david@tethera.net>\r
+Content-Type: text/plain; charset=UTF-8\r
+X-Mailman-Approved-At: Thu, 18 Dec 2014 21:43:25 -0800\r
+Cc: notmuch@notmuchmail.org\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://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: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Thu, 18 Dec 2014 21:10:30 -0000\r
+\r
+For now, as a workaround, I open the db, do my request, close it and\r
+repeat the process 5/10 sec later. I hope it does not add to much\r
+overhead ?! Anyway, it owuld be nice to have this fixed in one way or\r
+another.\r
+\r
+Thanks for your answer David.\r
+Best regards\r
+\r
+2014-12-16 9:02 GMT+01:00 David Bremner <david@tethera.net>:\r
+> Matt <mattator@gmail.com> writes:\r
+>\r
+>> 2014-12-15 21:41 GMT+01:00 David Bremner <david@tethera.net>:\r
+>>> Matt <mattator@gmail.com> writes:\r
+>>>\r
+>>>>> > But for exceptions in general, yes the notmuch library does need to be\r
+>>>>> > fixed to allow the caller of functions to distinguish between things\r
+>>>>> > like "no matches found" and "an exception occurred, so it's unknown if\r
+>>>>> > any messages match the search". That's a general class of library\r
+>>>>> > interface bugs that all need to be fixed.\r
+>>>>\r
+>>>> I 've also hit this *API bug* and was wondering if a fix had been done since\r
+>>>> then (I use notmuch 0.17) ? I found nothing on http://notmuchmail.org/news/\r
+>>>\r
+>>> Can you be more specific? I'd say in general no thorough overhaul of\r
+>>> error handling has happened, but if you can tell us what particular\r
+>>> libnotmuch function (or the equivalient python binding) you are having\r
+>>> trouble with, we may be able to give a more informative answer.\r
+>>>\r
+>>\r
+>> For instance when using the python bindings:\r
+>> In constructor I do\r
+>> self.db = notmuch.Database(self.db_path)\r
+>> and there I have a method called periodically that returns:\r
+>> returns notmuch.Query(self.db, "tag:unread and tag:inbox").count_messages()\r
+>>\r
+>> When it fails the previous method returns 0 and displays on stdout/stderr;\r
+>> "A Xapian exception occurred: The revision being read has been\r
+>> discarded - you should call Xapian::Database::reopen() and retry the\r
+>> operation\r
+>> Query string was: tag:unread and tag:inbox"\r
+>\r
+> Right, this seems to be a particularly heinous example.\r
+>\r
+> Any objections (or better ideas) from fellow developers to something\r
+> along the lines of the following? It isn't a huge improvement, and I\r
+> didn't update the other 3 places it's called (or the bindings), but it\r
+> seems like a step forward.  I guess something similar should be done for\r
+> notmuch_query_count_threads.\r
+>\r
+> Alternatively, we could follow unix tradition and return -1 on error.\r
+> The only argument I can see either way at the moment is that fewer error\r
+> return styles is better than more.\r
+>\r
+> diff --git a/lib/notmuch.h b/lib/notmuch.h\r
+> index 220839b..06228bc 100644\r
+> --- a/lib/notmuch.h\r
+> +++ b/lib/notmuch.h\r
+> @@ -901,8 +901,8 @@ notmuch_threads_destroy (notmuch_threads_t *threads);\r
+>   * If a Xapian exception occurs, this function may return 0 (after\r
+>   * printing a message).\r
+>   */\r
+> -unsigned\r
+> -notmuch_query_count_messages (notmuch_query_t *query);\r
+> +notmuch_status_t\r
+> +notmuch_query_count_messages (notmuch_query_t *query, unsigned *count);\r
+>\r
+>  /**\r
+>   * Return the number of threads matching a search.\r
+> diff --git a/lib/query.cc b/lib/query.cc\r
+> index 60ff8bd..a623ea8 100644\r
+> --- a/lib/query.cc\r
+> +++ b/lib/query.cc\r
+> @@ -508,8 +508,8 @@ notmuch_threads_destroy (notmuch_threads_t *threads)\r
+>      talloc_free (threads);\r
+>  }\r
+>\r
+> -unsigned\r
+> -notmuch_query_count_messages (notmuch_query_t *query)\r
+> +notmuch_status_t\r
+> +notmuch_query_count_messages (notmuch_query_t *query, unsigned *count_out)\r
+>  {\r
+>      notmuch_database_t *notmuch = query->notmuch;\r
+>      const char *query_string = query->query_string;\r
+> @@ -562,12 +562,11 @@ notmuch_query_count_messages (notmuch_query_t *query)\r
+>         count = mset.get_matches_estimated();\r
+>\r
+>      } catch (const Xapian::Error &error) {\r
+> -       fprintf (stderr, "A Xapian exception occurred: %s\n",\r
+> -                error.get_msg().c_str());\r
+> -       fprintf (stderr, "Query string was: %s\n", query->query_string);\r
+> +       return NOTMUCH_STATUS_XAPIAN_EXCEPTION;\r
+>      }\r
+> -\r
+> -    return count;\r
+> +\r
+> +    *count_out=count;\r
+> +    return NOTMUCH_STATUS_SUCCESS;\r
+>  }\r
+>\r
+>  unsigned\r
+> diff --git a/notmuch-count.c b/notmuch-count.c\r
+> index 6058f7c..db43959 100644\r
+> --- a/notmuch-count.c\r
+> +++ b/notmuch-count.c\r
+> @@ -71,6 +71,7 @@ print_count (notmuch_database_t *notmuch, const char *query_str,\r
+>  {\r
+>      notmuch_query_t *query;\r
+>      size_t i;\r
+> +    unsigned count;\r
+>\r
+>      query = notmuch_query_create (notmuch, query_str);\r
+>      if (query == NULL) {\r
+> @@ -83,7 +84,9 @@ print_count (notmuch_database_t *notmuch, const char *query_str,\r
+>\r
+>      switch (output) {\r
+>      case OUTPUT_MESSAGES:\r
+> -       printf ("%u\n", notmuch_query_count_messages (query));\r
+> +       if (notmuch_query_count_messages (query, &count))\r
+> +           return 1;\r
+> +       printf ("%u\n", count);\r
+>         break;\r
+>      case OUTPUT_THREADS:\r
+>         printf ("%u\n", notmuch_query_count_threads (query));\r
+> diff --git a/notmuch-reply.c b/notmuch-reply.c\r
+> index 7c1c809..5b7c0e1 100644\r
+> --- a/notmuch-reply.c\r
+> +++ b/notmuch-reply.c\r
+> @@ -650,8 +650,13 @@ notmuch_reply_format_sprinter(void *ctx,\r
+>      notmuch_messages_t *messages;\r
+>      notmuch_message_t *message;\r
+>      mime_node_t *node;\r
+> +    unsigned count;\r
+>\r
+> -    if (notmuch_query_count_messages (query) != 1) {\r
+> +    if (notmuch_query_count_messages (query, &count)) {\r
+> +       fprintf (stderr, "Error: Xapian exception counting messages.\n");\r
+> +       return 1;\r
+> +    }\r
+> +    if (count != 1) {\r
+>         fprintf (stderr, "Error: search term did not match precisely one message.\n");\r
+>         return 1;\r
+>      }\r