Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 1C3186DE026C for ; Sat, 7 May 2016 10:04:03 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: 0.601 X-Spam-Level: X-Spam-Status: No, score=0.601 tagged_above=-999 required=5 tests=[AWL=-0.051, SPF_NEUTRAL=0.652] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qr1U5KtbQ6OU for ; Sat, 7 May 2016 10:03:54 -0700 (PDT) Received: from guru.guru-group.fi (guru.guru-group.fi [46.183.73.34]) by arlo.cworth.org (Postfix) with ESMTP id BA2E16DE00EB for ; Sat, 7 May 2016 10:03:53 -0700 (PDT) Received: from guru.guru-group.fi (localhost [IPv6:::1]) by guru.guru-group.fi (Postfix) with ESMTP id A9CED100063; Sat, 7 May 2016 20:03:51 +0300 (EEST) From: Tomi Ollila To: David Bremner , notmuch@notmuchmail.org Subject: Re: [Patch v3 05/11] lib: provide config API In-Reply-To: <1462065879-29860-6-git-send-email-david@tethera.net> References: <1462065879-29860-1-git-send-email-david@tethera.net> <1462065879-29860-6-git-send-email-david@tethera.net> User-Agent: Notmuch/0.22+9~gb26b5ad (http://notmuchmail.org) Emacs/24.3.1 (x86_64-unknown-linux-gnu) X-Face: HhBM'cA~ MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 07 May 2016 17:04:03 -0000 On Sun, May 01 2016, David Bremner wrote: nits here > This is a thin wrapper around the Xapian metadata API. The job of this > layer is to keep the config key value pairs from colliding with other > metadata by transparently prefixing the keys, along with the usual glue > to provide a C interface. > > The split of _get_config into two functions is to allow returning of the > return value with different memory ownership semantics. > --- > lib/Makefile.local | 1 + > lib/config.cc | 90 ++++++++++++++++++++++++++++++++++++++++++++= ++++++ > lib/notmuch.h | 20 +++++++++++ > test/T590-libconfig.sh | 58 ++++++++++++++++++++++++++++++++ > 4 files changed, 169 insertions(+) > create mode 100644 lib/config.cc > create mode 100755 test/T590-libconfig.sh > > diff --git a/lib/Makefile.local b/lib/Makefile.local > index 36c3924..76b57cb 100644 > --- a/lib/Makefile.local > +++ b/lib/Makefile.local > @@ -49,6 +49,7 @@ libnotmuch_cxx_srcs =3D \ > $(dir)/index.cc \ > $(dir)/message.cc \ > $(dir)/query.cc \ > + $(dir)/config.cc \ > $(dir)/thread.cc >=20=20 > libnotmuch_modules :=3D $(libnotmuch_c_srcs:.c=3D.o) $(libnotmuch_cxx_sr= cs:.cc=3D.o) > diff --git a/lib/config.cc b/lib/config.cc > new file mode 100644 > index 0000000..af00d6f > --- /dev/null > +++ b/lib/config.cc > @@ -0,0 +1,90 @@ > +/* metadata.cc - API for database metadata config.cc or metadata.cc -- decide ! ;D > + * > + * Copyright =C2=A9 2015 David Bremner this could be 2016 now (?) (like it matters) > + * > + * This program is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 3 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see http://www.gnu.org/licenses/ . > + * > + * Author: David Bremner > + */ > + > +#include "notmuch.h" > +#include "notmuch-private.h" > +#include "database-private.h" > + > +static const std::string CONFIG_PREFIX=3D"C"; spacing. e.g. CONFIG_PREFIX =3D "C"; > + > +notmuch_status_t > +notmuch_database_set_config (notmuch_database_t *notmuch, > + const char *key, > + const char *value) > +{ > + notmuch_status_t status; > + Xapian::WritableDatabase *db; > + > + status =3D _notmuch_database_ensure_writable (notmuch); > + if (status) > + return status; > + > + try { > + db =3D static_cast (notmuch->xapian_db); > + db->set_metadata (CONFIG_PREFIX+key, value); > + } catch (const Xapian::Error &error) { > + status =3D NOTMUCH_STATUS_XAPIAN_EXCEPTION; > + notmuch->exception_reported =3D TRUE; > + if (! notmuch->exception_reported) { > + _notmuch_database_log (notmuch, "Error: A Xapian exception occurred= setting metadata: %s\n", The above goes up to column 104, but probably nothing is to be done there. > + error.get_msg().c_str()); > + } > + } > + return NOTMUCH_STATUS_SUCCESS; > +} > + > +static notmuch_status_t > +_metadata_value (notmuch_database_t *notmuch, > + const char *key, > + std::string &value) > +{ > + notmuch_status_t status =3D NOTMUCH_STATUS_SUCCESS; > + > + try { > + value =3D notmuch->xapian_db->get_metadata (CONFIG_PREFIX+key); spacing: e.g. (CONFIG_PREFIX + key); > + } catch (const Xapian::Error &error) { > + status =3D NOTMUCH_STATUS_XAPIAN_EXCEPTION; > + notmuch->exception_reported =3D TRUE; > + if (! notmuch->exception_reported) { > + _notmuch_database_log (notmuch, "Error: A Xapian exception occurred= getting metadata: %s\n", > + error.get_msg().c_str()); > + } > + } > + return status; > +} > + > +notmuch_status_t > +notmuch_database_get_config (notmuch_database_t *notmuch, > + const char *key, > + char **value) { In functions IIRC we always have opening brace in its own line. > + std::string strval; > + notmuch_status_t status; > + > + if (!value) > + return NOTMUCH_STATUS_NULL_POINTER; > + > + status =3D _metadata_value (notmuch, key, strval); > + if (status) > + return status; > + > + *value =3D strdup (strval.c_str ()); > + > + return NOTMUCH_STATUS_SUCCESS; > +} Tomi