Skip to content

Commit 4792f27

Browse files
committed
MINOR: pattern: add pat_ref_gen_delete() function
pat_ref_gen_delete(ref, gen_id, key) tries to delete all samples belonging to <gen_id> and matching <key> under <ref> The goal is to be able to target a single subset from <ref>
1 parent a131c54 commit 4792f27

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

include/haproxy/pattern.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ int pat_ref_set_elt_duplicate(struct pat_ref *ref, struct pat_ref_elt *elt, cons
194194
int pat_ref_gen_set(struct pat_ref *ref, unsigned int gen_id, const char *key, const char *value, char **err);
195195
int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const char *value, char **err);
196196
int pat_ref_delete(struct pat_ref *ref, const char *key);
197+
int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key);
197198
void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt);
198199
int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
199200
int pat_ref_prune(struct pat_ref *ref);

src/pattern.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,6 +1613,32 @@ int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt)
16131613
return 0;
16141614
}
16151615

1616+
/* This function removes all elements belonging to <gen_id> and matching <key>
1617+
* from the reference <ref>.
1618+
* This function returns 1 if the deletion is done and returns 0 if
1619+
* the entry is not found.
1620+
*/
1621+
int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key)
1622+
{
1623+
struct ebmb_node *node;
1624+
int found = 0;
1625+
1626+
/* delete pattern from reference */
1627+
node = ebst_lookup(&ref->ebmb_root, key);
1628+
while (node) {
1629+
struct pat_ref_elt *elt;
1630+
1631+
elt = ebmb_entry(node, struct pat_ref_elt, node);
1632+
node = ebmb_next_dup(node);
1633+
if (elt->gen_id != gen_id)
1634+
continue;
1635+
pat_ref_delete_by_ptr(ref, elt);
1636+
found = 1;
1637+
}
1638+
1639+
return found;
1640+
}
1641+
16161642
/* This function removes all patterns matching <key> from the reference
16171643
* and from each expr member of the reference. This function returns 1
16181644
* if the deletion is done and returns 0 is the entry is not found.

0 commit comments

Comments
 (0)