--- /dev/null
+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