summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorVladimír Čunát <vladimir.cunat@nic.cz>2024-03-11 08:09:38 +0100
committerAleš Mrázek <ales.mrazek@nic.cz>2024-07-02 14:07:48 +0200
commit824b1a52e6b1fd3850d5fc5060d578ae019c2e3a (patch)
tree2c3d2e0418ba0e12ef787dc44d49bd3aa14e7c97 /lib
parentdatamodel: check for unused tags during config validation (diff)
downloadknot-resolver-824b1a52e6b1fd3850d5fc5060d578ae019c2e3a.tar.xz
knot-resolver-824b1a52e6b1fd3850d5fc5060d578ae019c2e3a.zip
lib/rules kr_rules_init(): allow not overwriting the DB
Diffstat (limited to 'lib')
-rw-r--r--lib/rules/api.c21
-rw-r--r--lib/rules/api.h10
-rw-r--r--lib/rules/impl.h2
3 files changed, 15 insertions, 18 deletions
diff --git a/lib/rules/api.c b/lib/rules/api.c
index 8e908a7a..8d2c1028 100644
--- a/lib/rules/api.c
+++ b/lib/rules/api.c
@@ -141,9 +141,9 @@ int kr_rules_init_ensure(void)
{
if (the_rules)
return kr_ok();
- return kr_rules_init(NULL, 0);
+ return kr_rules_init(NULL, 0, true);
}
-int kr_rules_init(const char *path, size_t maxsize)
+int kr_rules_init(const char *path, size_t maxsize, bool overwrite)
{
if (the_rules)
return kr_error(EINVAL);
@@ -157,22 +157,17 @@ int kr_rules_init(const char *path, size_t maxsize)
// FIXME: the file will be sparse, but we still need to choose its size somehow.
// Later we might improve it to auto-resize in case of running out of space.
// Caveat: mdb_env_set_mapsize() can only be called without transactions open.
- .maxsize = maxsize ? maxsize :
- (size_t)(sizeof(size_t) > 4 ? 2048 : 500) * 1024*1024,
+ .maxsize = !overwrite ? 0 :
+ (maxsize ? maxsize : (size_t)(sizeof(size_t) > 4 ? 2048 : 500) * 1024*1024),
};
int ret = the_rules->api->open(&the_rules->db, &the_rules->stats, &opts, NULL);
- /* No persistence - we always refill from config for now.
- * LATER:
- * - Make it include versioning?
- * - "\0stamp" key when loading config(s)?
- * - Don't clear ruleset data that doesn't come directly from config;
- * and add marks for that, etc.
- * (after there actually are any kinds of rules like that)
- */
- if (ret == 0) ret = ruledb_op(clear);
+
+ if (ret == 0 && overwrite) ret = ruledb_op(clear);
if (ret != 0) goto failure;
kr_require(the_rules->db);
+ if (!overwrite) return kr_ok(); // we assume that the caller ensured OK contents
+
ret = tag_names_default();
if (ret != 0) goto failure;
diff --git a/lib/rules/api.h b/lib/rules/api.h
index 1069ef4d..f7f3b466 100644
--- a/lib/rules/api.h
+++ b/lib/rules/api.h
@@ -19,11 +19,13 @@ typedef uint64_t kr_rule_tags_t;
/** Open the rule DB.
*
- * You can call this to override the path or size (NULL/0 -> default).
- * Not allowed if already open (EINVAL), so this optional call has to come
- * before writing anything into the DB. */
+ * You can call this to override the path or size (NULL/0 -> default)
+ * or choose not to overwrite the DB with just the defaults.
+ *
+ * \return error code. Not allowed if already open (EINVAL),
+ * so this optional call has to come before writing anything into the DB. */
KR_EXPORT
-int kr_rules_init(const char *path, size_t maxsize);
+int kr_rules_init(const char *path, size_t maxsize, bool overwrite);
/** kr_rules_init() but OK if already open, and not allowing to override defaults. */
KR_EXPORT
int kr_rules_init_ensure(void);
diff --git a/lib/rules/impl.h b/lib/rules/impl.h
index 0d7de513..1a2ee4dd 100644
--- a/lib/rules/impl.h
+++ b/lib/rules/impl.h
@@ -20,7 +20,7 @@ extern struct kr_rules *the_rules;
#define ENSURE_the_rules \
if (!the_rules) { \
- int ret = kr_rules_init(NULL, 0); \
+ int ret = kr_rules_init(NULL, 0, true); \
if (ret) return ret; \
}