From 4792f278928719be8ea3957b32c2386c52970fb3 Mon Sep 17 00:00:00 2001 From: Aurelien DARRAGON Date: Wed, 20 Nov 2024 18:18:54 +0100 Subject: [PATCH] MINOR: pattern: add pat_ref_gen_delete() function pat_ref_gen_delete(ref, gen_id, key) tries to delete all samples belonging to and matching under The goal is to be able to target a single subset from --- include/haproxy/pattern.h | 1 + src/pattern.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/haproxy/pattern.h b/include/haproxy/pattern.h index 6b915987c..283eb5b08 100644 --- a/include/haproxy/pattern.h +++ b/include/haproxy/pattern.h @@ -194,6 +194,7 @@ int pat_ref_set_elt_duplicate(struct pat_ref *ref, struct pat_ref_elt *elt, cons int pat_ref_gen_set(struct pat_ref *ref, unsigned int gen_id, const char *key, const char *value, char **err); int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const char *value, char **err); int pat_ref_delete(struct pat_ref *ref, const char *key); +int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key); void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt); int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt); int pat_ref_prune(struct pat_ref *ref); diff --git a/src/pattern.c b/src/pattern.c index cf3bef96f..c433c10b2 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -1613,6 +1613,32 @@ int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt) return 0; } +/* This function removes all elements belonging to and matching + * from the reference . + * This function returns 1 if the deletion is done and returns 0 if + * the entry is not found. + */ +int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key) +{ + struct ebmb_node *node; + int found = 0; + + /* delete pattern from reference */ + node = ebst_lookup(&ref->ebmb_root, key); + while (node) { + struct pat_ref_elt *elt; + + elt = ebmb_entry(node, struct pat_ref_elt, node); + node = ebmb_next_dup(node); + if (elt->gen_id != gen_id) + continue; + pat_ref_delete_by_ptr(ref, elt); + found = 1; + } + + return found; +} + /* This function removes all patterns matching from the reference * and from each expr member of the reference. This function returns 1 * if the deletion is done and returns 0 is the entry is not found.