[PATCH 11/17] lib: Add an API to find a message by filename.
authorAustin Clements <amdragon@MIT.EDU>
Sat, 11 Jun 2011 20:04:37 +0000 (16:04 +2000)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:38:35 +0000 (09:38 -0800)
33/03e87a7563c3f09d0911acc7e0b5a2e2e3d25d [new file with mode: 0644]

diff --git a/33/03e87a7563c3f09d0911acc7e0b5a2e2e3d25d b/33/03e87a7563c3f09d0911acc7e0b5a2e2e3d25d
new file mode 100644 (file)
index 0000000..29c99c3
--- /dev/null
@@ -0,0 +1,203 @@
+Return-Path: <amthrax@drake.mit.edu>\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 1A1A5429E2F\r
+       for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:07:06 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+       tests=[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 YTonp0oUlZXf for <notmuch@notmuchmail.org>;\r
+       Sat, 11 Jun 2011 13:07:05 -0700 (PDT)\r
+Received: from dmz-mailsec-scanner-8.mit.edu (DMZ-MAILSEC-SCANNER-8.MIT.EDU\r
+       [18.7.68.37])\r
+       by olra.theworths.org (Postfix) with ESMTP id 66688429E2D\r
+       for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:07:05 -0700 (PDT)\r
+X-AuditID: 12074425-b7b82ae000000a2a-92-4df3cad1dd38\r
+Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])\r
+       by dmz-mailsec-scanner-8.mit.edu (Symantec Messaging Gateway) with SMTP\r
+       id 51.75.02602.1DAC3FD4; Sat, 11 Jun 2011 16:06:41 -0400 (EDT)\r
+Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])\r
+       by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id p5BK74c8030852; \r
+       Sat, 11 Jun 2011 16:07:04 -0400\r
+Received: from drake.mit.edu\r
+       (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com\r
+       [209.6.116.242]) (authenticated bits=0)\r
+       (User authenticated as amdragon@ATHENA.MIT.EDU)\r
+       by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id p5BK73aK006029\r
+       (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
+       Sat, 11 Jun 2011 16:07:04 -0400 (EDT)\r
+Received: from amthrax by drake.mit.edu with local (Exim 4.76)\r
+       (envelope-from <amthrax@drake.mit.edu>)\r
+       id 1QVUSV-0000IS-PX; Sat, 11 Jun 2011 16:07:03 -0400\r
+From: Austin Clements <amdragon@MIT.EDU>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 11/17] lib: Add an API to find a message by filename.\r
+Date: Sat, 11 Jun 2011 16:04:37 -0400\r
+Message-Id: <1307822683-848-12-git-send-email-amdragon@mit.edu>\r
+X-Mailer: git-send-email 1.7.5.1\r
+In-Reply-To: <1307822683-848-1-git-send-email-amdragon@mit.edu>\r
+References: <87ei34rnc5.fsf@yoom.home.cworth.org>\r
+       <1307822683-848-1-git-send-email-amdragon@mit.edu>\r
+X-Brightmail-Tracker:\r
+ H4sIAAAAAAAAA+NgFtrPIsWRmVeSWpSXmKPExsUixG6nonvx1Gdfgy8zxSyu35zJ7MDo8WzV\r
+       LeYAxigum5TUnMyy1CJ9uwSujEebD7MXXFeo+HHwI3MD4zPJLkZODgkBE4mD3x4yQ9hiEhfu\r
+       rWfrYuTiEBLYxyhx6P85dghnA6PE5llzWSCc+0wSH05PYIRw5jNKfNm0khGkn01AQ2Lb/uVg\r
+       toiAtMTOu7NZuxg5OJgF1CT+dKmAhIUFXCXefAVZwcnBIqAqcWzuVBYQm1fAXmLJ/ntQZyhI\r
+       XLkyDyzOCRSfd/AqmC0kkCax5NZu9gmM/AsYGVYxyqbkVunmJmbmFKcm6xYnJ+blpRbpWujl\r
+       ZpbopaaUbmIEh42L6g7GCYeUDjEKcDAq8fAqrv3sK8SaWFZcmXuIUZKDSUmUV+cEUIgvKT+l\r
+       MiOxOCO+qDQntfgQowQHs5II7/r2T75CvCmJlVWpRfkwKWkOFiVx3vmS6r5CAumJJanZqakF\r
+       qUUwWRkODiUJXklgfAgJFqWmp1akZeaUIKSZODhBhvMADT96EqiGt7ggMbc4Mx0if4pRl+Px\r
+       hk2HGIVY8vLzUqXEee+DFAmAFGWU5sHNgcX7K0ZxoLeEeX+AVPEAUwXcpFdAS5iAlgiUgi0p\r
+       SURISTUwrp9wr6lF48HbJDf+qc08tmV/Dj387j+rj+nqvHRBLe+VXgV/dJzXrA+a0PTohL/E\r
+       ntmz3pimn1BjvMz/aZbvxe2SZq6JJRcufnT3Eqsze2rcbNO//FQl9+7W95VtDCs9ZvTvaDOY\r
+       6jdj25+JzxNl/hRrBhxS/HsxanHv7riMH5N0nPZw5x/9pcRSnJFoqMVcVJwIAM6tA4rSAgAA\r
+Cc: Austin Clements <amdragon@mit.edu>\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: Sat, 11 Jun 2011 20:07:06 -0000\r
+\r
+notmuch_database_find_message_by_filename is mostly stolen from\r
+notmuch_database_remove_message, so this patch also vastly simplfies\r
+the latter using the former.\r
+\r
+This API is also useful in its own right and will be used in a later\r
+patch for eager maildir flag synchronization.\r
+---\r
+ lib/database.cc |   49 ++++++++++++++++++++++++++-----------------------\r
+ lib/notmuch.h   |   16 ++++++++++++++++\r
+ 2 files changed, 42 insertions(+), 23 deletions(-)\r
+\r
+diff --git a/lib/database.cc b/lib/database.cc\r
+index 9886622..daa619d 100644\r
+--- a/lib/database.cc\r
++++ b/lib/database.cc\r
+@@ -1747,57 +1747,60 @@ notmuch_status_t\r
+ notmuch_database_remove_message (notmuch_database_t *notmuch,\r
+                                const char *filename)\r
+ {\r
++    notmuch_message_t *message =\r
++      notmuch_database_find_message_by_filename (notmuch, filename);\r
++    notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;\r
++\r
++    if (message) {\r
++          status = _notmuch_message_remove_filename (message, filename);\r
++          if (status == NOTMUCH_STATUS_SUCCESS)\r
++              _notmuch_message_delete (message);\r
++          else if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)\r
++              _notmuch_message_sync (message);\r
++    }\r
++\r
++    return status;\r
++}\r
++\r
++notmuch_message_t *\r
++notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,\r
++                                         const char *filename)\r
++{\r
+     void *local;\r
+     const char *prefix = _find_prefix ("file-direntry");\r
+     char *direntry, *term;\r
+     Xapian::PostingIterator i, end;\r
+-    Xapian::Document document;\r
++    notmuch_message_t *message = NULL;\r
+     notmuch_status_t status;\r
\r
+-    status = _notmuch_database_ensure_writable (notmuch);\r
+-    if (status)\r
+-      return status;\r
+-\r
+     local = talloc_new (notmuch);\r
\r
+     try {\r
+-\r
+       status = _notmuch_database_filename_to_direntry (local, notmuch,\r
+                                                        filename, &direntry);\r
+       if (status)\r
+-          return status;\r
++          return NULL;\r
\r
+       term = talloc_asprintf (local, "%s%s", prefix, direntry);\r
\r
+       find_doc_ids_for_term (notmuch, term, &i, &end);\r
\r
+-      for ( ; i != end; i++) {\r
+-          Xapian::TermIterator j;\r
+-          notmuch_message_t *message;\r
++      if (i != end) {\r
+           notmuch_private_status_t private_status;\r
\r
+-          message = _notmuch_message_create (local, notmuch,\r
++          message = _notmuch_message_create (notmuch, notmuch,\r
+                                              *i, &private_status);\r
+-          if (message == NULL)\r
+-              return COERCE_STATUS (private_status,\r
+-                                    "Inconsistent document ID in datbase.");\r
+-\r
+-          status = _notmuch_message_remove_filename (message, filename);\r
+-          if (status == NOTMUCH_STATUS_SUCCESS)\r
+-              _notmuch_message_delete (message);\r
+-          else if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)\r
+-              _notmuch_message_sync (message);\r
+       }\r
+     } catch (const Xapian::Error &error) {\r
+-      fprintf (stderr, "Error: A Xapian exception occurred removing message: %s\n",\r
++      fprintf (stderr, "Error: A Xapian exception occurred finding message by filename: %s\n",\r
+                error.get_msg().c_str());\r
+       notmuch->exception_reported = TRUE;\r
+-      status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;\r
++      message = NULL;\r
+     }\r
\r
+     talloc_free (local);\r
\r
+-    return status;\r
++    return message;\r
+ }\r
\r
+ notmuch_string_list_t *\r
+diff --git a/lib/notmuch.h b/lib/notmuch.h\r
+index 830aa41..9ae260e 100644\r
+--- a/lib/notmuch.h\r
++++ b/lib/notmuch.h\r
+@@ -356,6 +356,22 @@ notmuch_message_t *\r
+ notmuch_database_find_message (notmuch_database_t *database,\r
+                              const char *message_id);\r
\r
++/* Find a message with the given filename.\r
++ *\r
++ * If the database contains a message with the given filename, then a\r
++ * new notmuch_message_t object is returned.  The caller should call \r
++ * notmuch_message_destroy when done with the message.\r
++ *\r
++ * This function returns NULL in the following situations:\r
++ *\r
++ *    * No message is found with the given filename\r
++ *    * An out-of-memory situation occurs\r
++ *    * A Xapian exception occurs\r
++ */\r
++notmuch_message_t *\r
++notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,\r
++                                         const char *filename);\r
++\r
+ /* Return a list of all tags found in the database.\r
+  *\r
+  * This function creates a list of all tags found in the database. The\r
+-- \r
+1.7.5.1\r
+\r