Re: Patch: Flush and Reopen
authorMartin Owens <doctormo@gmail.com>
Fri, 9 Sep 2011 17:55:50 +0000 (13:55 +2000)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:39:25 +0000 (09:39 -0800)
f4/86ceac075a9091ecb4e5acd1153840184bcd07 [new file with mode: 0644]

diff --git a/f4/86ceac075a9091ecb4e5acd1153840184bcd07 b/f4/86ceac075a9091ecb4e5acd1153840184bcd07
new file mode 100644 (file)
index 0000000..1ffd945
--- /dev/null
@@ -0,0 +1,221 @@
+Return-Path: <doctormo@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 66CCA431FD0\r
+       for <notmuch@notmuchmail.org>; Fri,  9 Sep 2011 10:55:55 -0700 (PDT)\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 LyjXEqodE8wC for <notmuch@notmuchmail.org>;\r
+       Fri,  9 Sep 2011 10:55:54 -0700 (PDT)\r
+Received: from mail-vx0-f181.google.com (mail-vx0-f181.google.com\r
+       [209.85.220.181]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id 9B746431FB6\r
+       for <notmuch@notmuchmail.org>; Fri,  9 Sep 2011 10:55:54 -0700 (PDT)\r
+Received: by vxl15 with SMTP id 15so784951vxl.26\r
+       for <notmuch@notmuchmail.org>; Fri, 09 Sep 2011 10:55:53 -0700 (PDT)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;\r
+       h=subject:from:to:cc:in-reply-to:references:content-type:date\r
+       :message-id:mime-version:x-mailer;\r
+       bh=LohzRBi4oCA1Uv/AGNGwyvoNqk+88ZyGTjnREnLyvMk=;\r
+       b=HPCgc3QlZ3J1MnbxSmsub7S7BIQjZqeVQj779CTcNFr7MAEDeLeLgMD1kFHoWIh6sw\r
+       QQQk9QEC39NPlwDlDYkTv5zHxeMQij+ep8n0UTUyq8LilmhOugzjSPN+aoCKBr3ZKSZN\r
+       Sp9yo+16lfCmhcY9lDMTq4zbFes17IltQ1q48=\r
+Received: by 10.52.22.84 with SMTP id b20mr2328082vdf.413.1315590952959;\r
+       Fri, 09 Sep 2011 10:55:52 -0700 (PDT)\r
+Received: from [192.168.1.190] (pool-68-163-190-45.bos.east.verizon.net\r
+       [68.163.190.45])\r
+       by mx.google.com with ESMTPS id be17sm5173198vdc.15.2011.09.09.10.55.50\r
+       (version=SSLv3 cipher=OTHER); Fri, 09 Sep 2011 10:55:51 -0700 (PDT)\r
+Subject: Re: Patch: Flush and Reopen\r
+From: Martin Owens <doctormo@gmail.com>\r
+To: David Bremner <david@tethera.net>\r
+In-Reply-To: <87obyuj7q1.fsf@zancas.localnet>\r
+References: <1315445674.32058.183.camel@delen>\r
+       <CAH-f9WtuYYuksfTHL1ZMmoRF6kyL7iFu9BXDzGn-wWGniSvf9w@mail.gmail.com>\r
+       <1315536861.2435.34.camel@delen>  <87obyuj7q1.fsf@zancas.localnet>\r
+Content-Type: multipart/mixed; boundary="=-if+DZnU/UI8bcf6/7HDh"\r
+Date: Fri, 09 Sep 2011 13:55:50 -0400\r
+Message-ID: <1315590950.2435.59.camel@delen>\r
+Mime-Version: 1.0\r
+X-Mailer: Evolution 2.30.3 \r
+Cc: Notmuch developer list <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: Fri, 09 Sep 2011 17:55:55 -0000\r
+\r
+\r
+--=-if+DZnU/UI8bcf6/7HDh\r
+Content-Type: text/plain; charset="UTF-8"\r
+Content-Transfer-Encoding: 7bit\r
+\r
+On Fri, 2011-09-09 at 08:06 -0300, David Bremner wrote:\r
+> I was also puzzled by your changes to debian/changelog. We really need\r
+> justification for every little change introduced by the patch; this is\r
+> another reason it helps to split things up a bit. \r
+\r
+That probably was unintended. See attached for the all new slimmed down\r
+patch.\r
+\r
+I've removed the debian control change, the changelog change, the extra\r
+error catch in query.cc and put that cast right.\r
+\r
+I'll leave the version of python-all for someone else.\r
+\r
+Best Regards, Martin Owens\r
+\r
+--=-if+DZnU/UI8bcf6/7HDh\r
+Content-Disposition: attachment;\r
+ filename*0=0001-Add-flush-and-reopen-methods-to-the-libnotmuch-and-t.pat;\r
+ filename*1=ch\r
+Content-Type: text/x-patch;\r
+ name="0001-Add-flush-and-reopen-methods-to-the-libnotmuch-and-t.patch";\r
+ charset="UTF-8"\r
+Content-Transfer-Encoding: 7bit\r
+\r
+>From 981b91e9405de2daf35d30d9bbeab0dd62b15683 Mon Sep 17 00:00:00 2001\r
+From: Martin Owens <doctormo@gmail.com>\r
+Date: Fri, 9 Sep 2011 13:51:59 -0400\r
+Subject: [PATCH] Add flush and reopen methods to the libnotmuch and to the python bindings. Flush allows read_write databases to commit their changes, forcing a flush to disk and reopen allows a read_only database to reread from the disk.\r
+\r
+Also added a handler for Xapian DatabaseChangedError which occurs when the flush happens to read only databases.\r
+---\r
+ bindings/python/notmuch/database.py |   10 ++++++++++\r
+ debian/libnotmuch1.symbols          |    2 ++\r
+ lib/database.cc                     |   33 ++++++++++++++++++++++++++-------\r
+ lib/notmuch.h                       |    8 ++++++++\r
+ 4 files changed, 46 insertions(+), 7 deletions(-)\r
+\r
+diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py\r
+index f18ca14..b6c1c31 100644\r
+--- a/bindings/python/notmuch/database.py\r
++++ b/bindings/python/notmuch/database.py\r
+@@ -432,6 +432,16 @@ class Database(object):\r
\r
+         return Query(self, querystring)\r
\r
++    def reopen(self):\r
++        """Reopens a read only database, when the data has changed, this is required."""\r
++        if self._db is not None:\r
++            nmlib.notmuch_database_reopen(self._db)\r
++\r
++    def flush(self):\r
++        """Flushes the search database, only available when in read-write."""\r
++        if self._db is not None:\r
++            nmlib.notmuch_database_flush(self._db)\r
++\r
+     def __repr__(self):\r
+         return "'Notmuch DB " + self.get_path() + "'"\r
\r
+diff --git a/debian/libnotmuch1.symbols b/debian/libnotmuch1.symbols\r
+index 05d86e6..7e42b0e 100644\r
+--- a/debian/libnotmuch1.symbols\r
++++ b/debian/libnotmuch1.symbols\r
+@@ -3,6 +3,7 @@ libnotmuch.so.1 libnotmuch1 #MINVER#\r
+  notmuch_database_close@Base 0.3\r
+  notmuch_database_create@Base 0.3\r
+  notmuch_database_find_message@Base 0.3\r
++ notmuch_database_flush@Base 0.3\r
+  notmuch_database_get_all_tags@Base 0.3\r
+  notmuch_database_get_directory@Base 0.3\r
+  notmuch_database_get_path@Base 0.3\r
+@@ -10,6 +11,7 @@ libnotmuch.so.1 libnotmuch1 #MINVER#\r
+  notmuch_database_needs_upgrade@Base 0.3\r
+  notmuch_database_open@Base 0.3\r
+  notmuch_database_remove_message@Base 0.3\r
++ notmuch_database_reopen@Base 0.3\r
+  notmuch_database_upgrade@Base 0.3\r
+  notmuch_directory_destroy@Base 0.3\r
+  notmuch_directory_get_child_directories@Base 0.3\r
+diff --git a/lib/database.cc b/lib/database.cc\r
+index 9c2f4ec..b86bf1a 100644\r
+--- a/lib/database.cc\r
++++ b/lib/database.cc\r
+@@ -700,18 +700,37 @@ notmuch_database_open (const char *path,\r
+ }\r
\r
+ void\r
+-notmuch_database_close (notmuch_database_t *notmuch)\r
++notmuch_database_reopen (notmuch_database_t *notmuch)\r
+ {\r
+     try {\r
+-      if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)\r
+-          (static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->flush ();\r
++        if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY)\r
++            (static_cast <Xapian::Database *> (notmuch->xapian_db))->reopen();\r
+     } catch (const Xapian::Error &error) {\r
+-      if (! notmuch->exception_reported) {\r
+-          fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n",\r
+-                   error.get_msg().c_str());\r
+-      }\r
++        if (! notmuch->exception_reported) {\r
++            fprintf (stderr, "Error: A Xapian exception occurred reopening database: %s\n",\r
++                error.get_msg().c_str());\r
++        }\r
+     }\r
++}\r
\r
++void\r
++notmuch_database_flush (notmuch_database_t *notmuch)\r
++{\r
++    try {\r
++        if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)\r
++            (static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->flush();\r
++    } catch (const Xapian::Error &error) {\r
++        if (! notmuch->exception_reported) {\r
++            fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n",\r
++                error.get_msg().c_str());\r
++        }\r
++    }\r
++}\r
++\r
++void\r
++notmuch_database_close (notmuch_database_t *notmuch)\r
++{\r
++    notmuch_database_flush (notmuch);\r
+     delete notmuch->term_gen;\r
+     delete notmuch->query_parser;\r
+     delete notmuch->xapian_db;\r
+diff --git a/lib/notmuch.h b/lib/notmuch.h\r
+index 974be8d..ca87b89 100644\r
+--- a/lib/notmuch.h\r
++++ b/lib/notmuch.h\r
+@@ -171,6 +171,14 @@ notmuch_database_t *\r
+ notmuch_database_open (const char *path,\r
+                      notmuch_database_mode_t mode);\r
\r
++/* Reopen a read_only database when the data source has changed */\r
++void\r
++notmuch_database_reopen (notmuch_database_t *database);\r
++\r
++/* Force a flush of the xapian database, also done on close */\r
++void\r
++notmuch_database_flush (notmuch_database_t *database);\r
++\r
+ /* Close the given notmuch database, freeing all associated\r
+  * resources. See notmuch_database_open. */\r
+ void\r
+-- \r
+1.7.1\r
+\r
+\r
+--=-if+DZnU/UI8bcf6/7HDh--\r
+\r