int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
-int kr_rules_init(const char *, size_t);
+int kr_rules_init(const char *, size_t, _Bool);
int kr_rules_commit(_Bool);
int kr_view_insert_action(const char *, const char *, kr_proto_set, const char *);
int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
-int kr_rules_init(const char *, size_t);
+int kr_rules_init(const char *, size_t, _Bool);
int kr_rules_commit(_Bool);
int kr_view_insert_action(const char *, const char *, kr_proto_set, const char *);
int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
-int kr_rules_init(const char *, size_t);
+int kr_rules_init(const char *, size_t, _Bool);
int kr_rules_commit(_Bool);
int kr_view_insert_action(const char *, const char *, kr_proto_set, const char *);
int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
{
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);
// 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;
/** 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);
#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; \
}