From: David Bremner <david@tethera.net>
To: notmuch@notmuchmail.org
Cc: David Bremner <david@tethera.net>
Subject: [PATCH 29/36] lib/config: make values iterators restartable
Date: Sun, 3 Jan 2021 19:35:40 -0400 [thread overview]
Message-ID: <20210103233547.122707-30-david@tethera.net> (raw)
In-Reply-To: <20210103233547.122707-1-david@tethera.net>
This is relatively cheap, and makes it easier to transform existing
code which uses arrays of pointers to store configuration lists.
---
lib/config.cc | 41 ++++++++++++++++++++++++++++++++---------
lib/notmuch.h | 12 ++++++++++++
test/T590-libconfig.sh | 32 ++++++++++++++++++++++++++++++++
3 files changed, 76 insertions(+), 9 deletions(-)
diff --git a/lib/config.cc b/lib/config.cc
index 47160af1..7a1494be 100644
--- a/lib/config.cc
+++ b/lib/config.cc
@@ -34,6 +34,8 @@ struct _notmuch_config_list {
struct _notmuch_config_values {
const char *iterator;
size_t tok_len;
+ const char *string;
+ void *children; /* talloc_context */
};
static const char * _notmuch_config_key_to_string (notmuch_config_key_t key);
@@ -256,23 +258,33 @@ _notmuch_config_load_from_database (notmuch_database_t *notmuch)
notmuch_config_values_t *
notmuch_config_get_values (notmuch_database_t *notmuch, notmuch_config_key_t key)
{
- notmuch_config_values_t *values;
+ notmuch_config_values_t *values = NULL;
+ bool ok = false;
- const char *str;
const char *key_str = _notmuch_config_key_to_string (key);
if (! key_str)
- return NULL;
-
- str = _notmuch_string_map_get (notmuch->config, key_str);
- if (! str)
- return NULL;
+ goto DONE;
values = talloc (notmuch, notmuch_config_values_t);
if (unlikely(! values))
- return NULL;
+ goto DONE;
+
+ values->children = talloc_new (values);
+
+ values->string = _notmuch_string_map_get (notmuch->config, key_str);
+ if (! values->string)
+ goto DONE;
+
+ values->iterator = strsplit_len (values->string, ';', &(values->tok_len));
+ ok = true;
- values->iterator = strsplit_len (str, ';', &(values->tok_len));
+ DONE:
+ if (!ok) {
+ if (values)
+ talloc_free(values);
+ return NULL;
+ }
return values;
}
@@ -289,6 +301,17 @@ notmuch_config_values_get (notmuch_config_values_t *values) {
return talloc_strndup (values, values->iterator, values->tok_len);
}
+void
+notmuch_config_values_start (notmuch_config_values_t *values) {
+ if (values->children) {
+ talloc_free (values->children);
+ }
+
+ values->children = talloc_new (values);
+
+ values->iterator = strsplit_len (values->string, ';', &(values->tok_len));
+}
+
void
notmuch_config_values_move_to_next (notmuch_config_values_t *values) {
values->iterator += values->tok_len;
diff --git a/lib/notmuch.h b/lib/notmuch.h
index 95b2180f..527dbee6 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -2522,6 +2522,18 @@ notmuch_config_values_get (notmuch_config_values_t *values);
void
notmuch_config_values_move_to_next (notmuch_config_values_t *values);
+
+/**
+ * reset the 'values' iterator to the first element
+ *
+ * @param[in,out] values iterator
+ *
+ * @since libnotmuch 5.4 (notmuch 0.32)
+ *
+ */
+void
+notmuch_config_values_start (notmuch_config_values_t *values);
+
/**
* Destroy a config values iterator, along with any associated
* resources.
diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh
index 24f03ba7..97f8fdc7 100755
--- a/test/T590-libconfig.sh
+++ b/test/T590-libconfig.sh
@@ -224,6 +224,38 @@ EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
+test_begin_subtest "notmuch_config_get_values (restart)"
+cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
+{
+ notmuch_config_values_t *values;
+ EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
+ for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
+ notmuch_config_values_valid (values);
+ notmuch_config_values_move_to_next (values))
+ {
+ puts (notmuch_config_values_get (values));
+ }
+ for (notmuch_config_values_start (values);
+ notmuch_config_values_valid (values);
+ notmuch_config_values_move_to_next (values))
+ {
+ puts (notmuch_config_values_get (values));
+ }
+}
+EOF
+cat <<'EOF' >EXPECTED
+== stdout ==
+a
+b
+c
+a
+b
+c
+== stderr ==
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+restore_database
+
backup_database
test_begin_subtest "notmuch_config_get_values, trailing ;"
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
--
2.29.2
next prev parent reply other threads:[~2021-01-03 23:37 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-03 23:35 v3 merged config David Bremner
2021-01-03 23:35 ` [PATCH 01/36] test/T750-gzip: don't compress the xapian database David Bremner
2021-01-10 15:28 ` Tomi Ollila
2021-01-11 0:57 ` David Bremner
2021-01-11 17:40 ` Tomi Ollila
2021-01-03 23:35 ` [PATCH 02/36] test/T391-python-cffi David Bremner
2021-01-10 15:33 ` Tomi Ollila
2021-01-15 11:51 ` David Bremner
2021-01-15 11:53 ` David Bremner
2021-01-15 17:07 ` Tomi Ollila
2021-01-03 23:35 ` [PATCH 03/36] lib: add _notmuch_string_map_set David Bremner
2021-01-03 23:35 ` [PATCH 04/36] lib: cache configuration information from database David Bremner
2021-01-03 23:35 ` [PATCH 05/36] lib: add stub for notmuch_database_open_with_config David Bremner
2021-01-03 23:35 ` [PATCH 06/36] lib/open: add support for config profiles and default locations David Bremner
2021-01-03 23:35 ` [PATCH 07/36] CLI: generalize notmuch_config_mode_t David Bremner
2021-01-03 23:35 ` [PATCH 08/36] lib/config: add notmuch_config_key_{get,set} David Bremner
2021-01-03 23:35 ` [PATCH 09/36] lib/open: load default values for known configuration keys David Bremner
2021-01-03 23:35 ` [PATCH 10/36] CLI: add (unused) database argument to subcommands David Bremner
2021-01-03 23:35 ` [PATCH 11/36] util: add strsplit_len: simplified strtok with delimiter escaping David Bremner
2021-01-03 23:35 ` [PATCH 12/36] lib/config: add config values iterator David Bremner
2021-01-03 23:35 ` [PATCH 13/36] CLI/count: switch to new configuration framework David Bremner
2021-01-03 23:35 ` [PATCH 14/36] cli/dump: convert to new config framework David Bremner
2021-01-03 23:35 ` [PATCH 15/36] lib: add notmuch_config_get_bool David Bremner
2021-01-03 23:35 ` [PATCH 16/36] CLI/restore: convert to new config framework David Bremner
2021-01-03 23:35 ` [PATCH 17/36] CLI/insert: " David Bremner
2021-01-03 23:35 ` [PATCH 18/36] cli/reindex: convert " David Bremner
2021-01-03 23:35 ` [PATCH 19/36] CLI/reply: convert to " David Bremner
2021-01-03 23:35 ` [PATCH 20/36] CLI/{search,address}: convert to new configuration framework David Bremner
2021-01-03 23:35 ` [PATCH 21/36] cli/config: add accessor for config file name David Bremner
2021-01-03 23:35 ` [PATCH 22/36] CLI/show: mostly switch show to new config framework David Bremner
2021-01-03 23:35 ` [PATCH 23/36] cli/tag: convert " David Bremner
2021-01-03 23:35 ` [PATCH 24/36] lib/config: add _notmuch_config_cache David Bremner
2021-01-03 23:35 ` [PATCH 25/36] lib: split notmuch_database_compact David Bremner
2021-01-03 23:35 ` [PATCH 26/36] cli/compact: convert to new configuration framework David Bremner
2021-01-03 23:35 ` [PATCH 27/36] bindings/notmuch2: add missing crypto error status codes David Bremner
2021-01-03 23:35 ` [PATCH 28/36] lib/config: add NOTMUCH_CONFIG_NEW_IGNORE David Bremner
2021-01-03 23:35 ` David Bremner [this message]
2021-01-03 23:35 ` [PATCH 30/36] lib/open: factor out first part of open David Bremner
2021-01-03 23:35 ` [PATCH 31/36] lib: add NOTMUCH_STATUS_NO_CONFIG David Bremner
2021-01-03 23:35 ` [PATCH 32/36] lib/database: move n_d_create* to open.cc David Bremner
2021-01-03 23:35 ` [PATCH 33/36] lib: add NOTMUCH_STATUS_DATABASE_EXISTS David Bremner
2021-01-03 23:35 ` [PATCH 34/36] lib: introduce notmuch_database_create_with_config David Bremner
2021-01-03 23:35 ` [PATCH 35/36] cli/new: refactor database upgrade code David Bremner
2021-01-03 23:35 ` [PATCH 36/36] cli/new: convert to new config framework David Bremner
2021-01-06 2:48 ` v3 merged config David Bremner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210103233547.122707-30-david@tethera.net \
--to=david@tethera.net \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).