#include <stdio.h>
#include <errno.h>
+#include <import/cebs_tree.h>
#include <import/ebistree.h>
#include <import/ebpttree.h>
#include <import/ebsttree.h>
HA_RWLOCK_WRUNLOCK(PATEXP_LOCK, &expr->lock);
LIST_DELETE(&elt->list);
- ebmb_delete(&elt->node);
+ cebs_item_delete(&ref->ceb_root, node, pattern, elt);
free(elt->sample);
free(elt);
HA_ATOMIC_INC(&patterns_freed);
*/
int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key)
{
- struct ebmb_node *node;
+ struct pat_ref_elt *elt, *next;
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);
+ elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt);
+ while (elt) {
if (elt->gen_id != gen_id)
continue;
+ next = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
pat_ref_delete_by_ptr(ref, elt);
found = 1;
+ elt = next;
}
if (found)
*/
struct pat_ref_elt *pat_ref_gen_find_elt(struct pat_ref *ref, unsigned int gen_id, const char *key)
{
- struct ebmb_node *node;
struct pat_ref_elt *elt;
- node = ebst_lookup(&ref->ebmb_root, key);
- while (node) {
- elt = ebmb_entry(node, struct pat_ref_elt, node);
+ elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt);
+ while (elt) {
if (elt->gen_id == gen_id)
break;
- node = ebmb_next_dup(node);
+ elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
}
- if (node)
- return ebmb_entry(node, struct pat_ref_elt, node);
-
- return NULL;
+ return elt;
}
/*
return 0;
}
-static int pat_ref_set_from_node(struct pat_ref *ref, struct ebmb_node *node, const char *value, char **err)
+static int pat_ref_set_from_elt(struct pat_ref *ref, struct pat_ref_elt *elt, const char *value, char **err)
{
- struct pat_ref_elt *elt;
unsigned int gen;
int first = 1;
int found = 0;
- while (node) {
+ while (elt) {
char *tmp_err = NULL;
- elt = ebmb_entry(node, struct pat_ref_elt, node);
if (first)
gen = elt->gen_id;
else if (elt->gen_id != gen) {
/* only consider duplicate elements from the same gen! */
continue;
}
- node = ebmb_next_dup(node);
+
if (!pat_ref_set_elt(ref, elt, value, &tmp_err)) {
if (err)
*err = tmp_err;
}
found = 1;
first = 0;
+ elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
}
if (!found) {
int pat_ref_set_elt_duplicate(struct pat_ref *ref, struct pat_ref_elt *elt, const char *value,
char **err)
{
- return pat_ref_set_from_node(ref, &elt->node, value, err);
+ return pat_ref_set_from_elt(ref, elt, value, err);
}
/* This function modifies to <value> the sample of all patterns matching <key>
int pat_ref_gen_set(struct pat_ref *ref, unsigned int gen_id,
const char *key, const char *value, char **err)
{
- struct ebmb_node *node;
struct pat_ref_elt *elt;
/* Look for pattern in the reference. */
- node = ebst_lookup(&ref->ebmb_root, key);
- while (node) {
- elt = ebmb_entry(node, struct pat_ref_elt, node);
+ elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt);
+ while (elt) {
if (elt->gen_id == gen_id)
break;
- node = ebmb_next_dup(node);
+ elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
}
- return pat_ref_set_from_node(ref, node, value, err);
+ return pat_ref_set_from_elt(ref, elt, value, err);
}
/* This function modifies to <value> the sample of all patterns matching <key>
ref->revision = 0;
ref->entry_cnt = 0;
LIST_INIT(&ref->head);
- ref->ebmb_root = EB_ROOT;
+ ref->ceb_root = NULL;
LIST_INIT(&ref->pat);
HA_RWLOCK_INIT(&ref->lock);
event_hdl_sub_list_init(&ref->e_subs);
elt->list_head = NULL;
elt->tree_head = NULL;
LIST_APPEND(&ref->head, &elt->list);
- /* Even if calloc()'ed, ensure this node is not linked to a tree. */
- elt->node.node.leaf_p = NULL;
- ebst_insert(&ref->ebmb_root, &elt->node);
+ cebs_item_insert(&ref->ceb_root, node, pattern, elt);
HA_ATOMIC_INC(&patterns_added);
return elt;
fail:
pat_delete_gen(ref, elt);
LIST_DELETE(&elt->list);
- ebmb_delete(&elt->node);
+ cebs_item_delete(&ref->ceb_root, node, pattern, elt);
free(elt->sample);
free(elt);
HA_ATOMIC_INC(&patterns_freed);