summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 77a6c3b)
raw | patch | inline | side by side (parent: 77a6c3b)
author | Sebastian Harl <sh@tokkee.org> | |
Thu, 19 Jun 2014 13:09:23 +0000 (15:09 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Thu, 19 Jun 2014 13:09:23 +0000 (15:09 +0200) |
src/core/store-private.h | patch | blob | history | |
src/core/store_lookup.c | patch | blob | history | |
src/include/core/store.h | patch | blob | history | |
t/unit/core/store_lookup_test.c | patch | blob | history |
index cda98357cadaa114e0af20f956f9927dc7e9cf49..64a70c31059f519f432a5ea40227441956bd7d25 100644 (file)
--- a/src/core/store-private.h
+++ b/src/core/store-private.h
MATCHER_NOT,
MATCHER_NAME,
MATCHER_ATTR,
- MATCHER_SERVICE,
MATCHER_HOST,
};
} attr_matcher_t;
#define ATTR_M(m) ((attr_matcher_t *)(m))
-/* match services */
-typedef struct {
- obj_matcher_t super;
- /* match by attributes assigned to the service */
- attr_matcher_t *attr;
-} service_matcher_t;
-#define SERVICE_M(m) ((service_matcher_t *)(m))
-
/* match hosts */
typedef struct {
obj_matcher_t super;
- /* match by services assigned to the host */
- service_matcher_t *service;
/* match by attributes assigned to the host */
attr_matcher_t *attr;
} host_matcher_t;
index b5b40e6f59badcc04bd2f83754bceab566a1724a..1fe45dfe11f58510cd5ec6a884dc48135130cc5b 100644 (file)
--- a/src/core/store_lookup.c
+++ b/src/core/store_lookup.c
return buf;
} /* attr_tostring */
-static char *
-service_tostring(sdb_store_matcher_t *m, char *buf, size_t buflen)
-{
- char name[buflen + 1], attr[buflen + 1];
-
- if (! m) {
- snprintf(buf, buflen, "SERVICE{}");
- return buf;
- }
-
- assert(m->type == MATCHER_SERVICE);
- snprintf(buf, buflen, "SERVICE{ NAME%s, %s }",
- obj_name_tostring(&OBJ_M(m)->name, name, sizeof(name)),
- attr_tostring(SDB_STORE_MATCHER(SERVICE_M(m)->attr),
- attr, sizeof(attr)));
- return buf;
-} /* service_tostring */
-
static char *
host_tostring(sdb_store_matcher_t *m, char *buf, size_t buflen)
{
- char name[buflen + 1], service[buflen + 1], attr[buflen + 1];
+ char name[buflen + 1], attr[buflen + 1];
if (! m) {
snprintf(buf, buflen, "HOST{}");
}
assert(m->type == MATCHER_HOST);
- snprintf(buf, buflen, "HOST{ NAME%s, %s, %s }",
+ snprintf(buf, buflen, "HOST{ NAME%s, %s }",
obj_name_tostring(&OBJ_M(m)->name, name, sizeof(name)),
- service_tostring(SDB_STORE_MATCHER(HOST_M(m)->service),
- service, sizeof(service)),
attr_tostring(SDB_STORE_MATCHER(HOST_M(m)->attr),
attr, sizeof(attr)));
return buf;
}
} /* match_attr */
-/* match service specific values;
- * always call this function through match_obj() */
-static int
-match_service(service_matcher_t *m, sdb_store_base_t *obj)
-{
- sdb_llist_iter_t *iter;
-
- assert(m && obj);
-
- if (obj->type != SDB_SERVICE)
- return 0;
-
- if (! m->attr)
- return 1;
-
- iter = sdb_llist_get_iter(SDB_STORE_OBJ(obj)->attributes);
- while (sdb_llist_iter_has_next(iter)) {
- sdb_store_base_t *attr = STORE_BASE(sdb_llist_iter_get_next(iter));
-
- /* if any of the attributes matches we found a matching service */
- if (match_obj(M(m->attr), attr)) {
- sdb_llist_iter_destroy(iter);
- return 1;
- }
- }
- sdb_llist_iter_destroy(iter);
- return 0;
-} /* match_service */
-
/* match host specific values;
* always call this function through match_obj() */
static int
match_host(host_matcher_t *m, sdb_store_base_t *obj)
{
sdb_llist_iter_t *iter;
- int status;
assert(m && obj);
if (obj->type != SDB_HOST)
return 0;
- if (m->service) {
- iter = sdb_llist_get_iter(SDB_STORE_OBJ(obj)->children);
- status = 0;
- }
- else {
- iter = NULL;
- status = 1;
- }
- while (sdb_llist_iter_has_next(iter)) {
- sdb_store_base_t *service = STORE_BASE(sdb_llist_iter_get_next(iter));
-
- /* found a matching service */
- if (match_obj(M(m->service), service)) {
- status = 1;
- break;
- }
- }
- sdb_llist_iter_destroy(iter);
-
- if (! status)
- return status;
- else if (! m->attr)
+ if (! m->attr)
return 1;
iter = sdb_llist_get_iter(SDB_STORE_OBJ(obj)->attributes);
match_name,
match_obj,
match_obj,
- match_obj,
};
typedef char *(*matcher_tostring_cb)(sdb_store_matcher_t *, char *, size_t);
unary_tostring,
name_tostring,
attr_tostring,
- service_tostring,
host_tostring,
};
case MATCHER_ATTR:
return match_attr(ATTR_M(m), obj);
break;
- case MATCHER_SERVICE:
- return match_service(SERVICE_M(m), obj);
- break;
case MATCHER_HOST:
return match_host(HOST_M(m), obj);
break;
name_matcher_destroy(&attr->value);
} /* attr_matcher_destroy */
-static int
-service_matcher_init(sdb_object_t *obj, va_list ap)
-{
- attr_matcher_t *attr;
- int status;
-
- status = obj_matcher_init(obj, ap);
- if (status)
- return status;
-
- attr = va_arg(ap, attr_matcher_t *);
-
- sdb_object_ref(SDB_OBJ(attr));
- SERVICE_M(obj)->attr = attr;
-
- M(obj)->type = MATCHER_SERVICE;
- return 0;
-} /* service_matcher_init */
-
-static void
-service_matcher_destroy(sdb_object_t *obj)
-{
- obj_matcher_destroy(obj);
- sdb_object_deref(SDB_OBJ(SERVICE_M(obj)->attr));
-} /* service_matcher_destroy */
-
static int
host_matcher_init(sdb_object_t *obj, va_list ap)
{
- service_matcher_t *service;
attr_matcher_t *attr;
int status;
if (status)
return status;
- service = va_arg(ap, service_matcher_t *);
attr = va_arg(ap, attr_matcher_t *);
-
- sdb_object_ref(SDB_OBJ(service));
- HOST_M(obj)->service = service;
sdb_object_ref(SDB_OBJ(attr));
HOST_M(obj)->attr = attr;
host_matcher_destroy(sdb_object_t *obj)
{
obj_matcher_destroy(obj);
- sdb_object_deref(SDB_OBJ(HOST_M(obj)->service));
sdb_object_deref(SDB_OBJ(HOST_M(obj)->attr));
} /* host_matcher_destroy */
/* destroy = */ attr_matcher_destroy,
};
-static sdb_type_t service_type = {
- /* size = */ sizeof(service_matcher_t),
- /* init = */ service_matcher_init,
- /* destroy = */ service_matcher_destroy,
-};
-
static sdb_type_t host_type = {
/* size = */ sizeof(host_matcher_t),
/* init = */ host_matcher_init,
attr_name, attr_name_re, attr_value, attr_value_re));
} /* sdb_store_attr_matcher */
-sdb_store_matcher_t *
-sdb_store_service_matcher(const char *service_name, const char *service_name_re,
- sdb_store_matcher_t *attr_matcher)
-{
- return M(sdb_object_create("service-matcher", service_type,
- service_name, service_name_re, attr_matcher));
-} /* sdb_store_service_matcher */
-
sdb_store_matcher_t *
sdb_store_host_matcher(const char *host_name, const char *host_name_re,
- sdb_store_matcher_t *service_matcher,
sdb_store_matcher_t *attr_matcher)
{
return M(sdb_object_create("host-matcher", host_type,
- host_name, host_name_re, service_matcher, attr_matcher));
+ host_name, host_name_re, attr_matcher));
} /* sdb_store_host_matcher */
sdb_store_matcher_t *
m = sdb_store_name_matcher(type, value, re);
else if (type == SDB_ATTRIBUTE) {
m = sdb_store_host_matcher(/* name = */ NULL, NULL,
- /* service = */ NULL,
sdb_store_attr_matcher(attr, NULL, matcher, matcher_re));
/* pass ownership to the host matcher */
index 68ee3aa1aae42e73212610a49eb48658b8343e9e..856e19c5220894e558e5e0f1d03afb68ac7dda23 100644 (file)
--- a/src/include/core/store.h
+++ b/src/include/core/store.h
sdb_store_attr_matcher(const char *attr_name, const char *attr_name_re,
const char *attr_value, const char *attr_value_re);
-/*
- * sdb_store_service_matcher:
- * Creates a matcher matching services based on their name or attributes.
- */
-sdb_store_matcher_t *
-sdb_store_service_matcher(const char *service_name, const char *service_name_re,
- sdb_store_matcher_t *attr_matcher);
-
/*
* sdb_store_host_matcher:
- * Creates a matcher matching hosts based on their name, services assigned to
- * the host, or its attributes.
+ * Creates a matcher matching hosts based on their name or its attributes.
*/
sdb_store_matcher_t *
sdb_store_host_matcher(const char *host_name, const char *host_name_re,
- sdb_store_matcher_t *service_matcher,
sdb_store_matcher_t *attr_matcher);
/*
index efd2071e4590ef9b6846e2b3015ef5ffd39c5366..1a55d87844883b0af20bad5231dec0420c573072 100644 (file)
const char *hostname;
const char *hostname_re;
- const char *service_name;
- const char *service_name_re;
-
const char *attr_name;
const char *attr_name_re;
const char *attr_value;
} golden_data[] = {
{
/* host */ NULL, NULL,
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 1
},
{
/* host */ "a", NULL,
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 1
},
{
/* host */ "b", NULL,
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 0
},
{
/* host */ NULL, "^a$",
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 1
},
{
/* host */ NULL, "^b$",
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 0
},
{
/* host */ "a", "^a$",
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 1
},
{
/* host */ "a", "^b$",
- /* svc */ NULL, NULL,
/* attr */ NULL, NULL, NULL, NULL, 0
},
{
/* host */ "b", "^a$",
- /* svc */ NULL, NULL,
- /* attr */ NULL, NULL, NULL, NULL, 0
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "s1", NULL,
- /* attr */ NULL, NULL, NULL, NULL, 1
- },
- {
- /* host */ "a", "^a$",
- /* svc */ NULL, "^s1$",
- /* attr */ NULL, NULL, NULL, NULL, 1
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "s1", "^s1$",
- /* attr */ NULL, NULL, NULL, NULL, 1
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "x1", NULL,
/* attr */ NULL, NULL, NULL, NULL, 0
},
{
/* host */ "a", "^a$",
- /* svc */ NULL, "x",
- /* attr */ NULL, NULL, NULL, NULL, 0
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "x1", "x",
- /* attr */ NULL, NULL, NULL, NULL, 0
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "s1", "x",
- /* attr */ NULL, NULL, NULL, NULL, 0
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "x1", "s",
- /* attr */ NULL, NULL, NULL, NULL, 0
- },
- {
- /* host */ "a", "^a$",
- /* svc */ "s1", "^s1$",
/* attr */ "k1", NULL, NULL, NULL, 1
},
{
/* host */ "a", "^a$",
- /* svc */ "s1", "^s1$",
/* attr */ NULL, "^k", NULL, NULL, 1
},
{
/* host */ "a", "^a$",
- /* svc */ "s1", "^s1$",
/* attr */ NULL, NULL, "v1", NULL, 1
},
{
/* host */ "a", "^a$",
- /* svc */ "s1", "^s1$",
/* attr */ NULL, NULL, NULL, "^v1$", 1
},
{
/* host */ "a", "^a$",
- /* svc */ "s1", "^s1$",
/* attr */ "k1", "1", "v1", "1", 1
},
};
"sdb_store_get_host(a) = NULL; expected: <host>");
for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
- sdb_store_matcher_t *h, *s, *a, *n;
+ sdb_store_matcher_t *h, *a, *n;
int status;
- s = sdb_store_service_matcher(golden_data[i].service_name,
- golden_data[i].service_name_re, NULL);
- fail_unless(s != NULL,
- "sdb_store_service_matcher() = NULL; expected: <matcher>");
-
a = sdb_store_attr_matcher(golden_data[i].attr_name,
golden_data[i].attr_name_re, golden_data[i].attr_value,
golden_data[i].attr_value_re);
"sdb_store_attr_matcher() = NULL; expected: <matcher>");
h = sdb_store_host_matcher(golden_data[i].hostname,
- golden_data[i].hostname_re, s, a);
+ golden_data[i].hostname_re, a);
fail_unless(h != NULL,
"sdb_store_host_matcher() = NULL: expected: <matcher>");
/* pass ownership to the host matcher */
- sdb_object_deref(SDB_OBJ(s));
sdb_object_deref(SDB_OBJ(a));
status = sdb_store_matcher_matches(h, obj);
fail_unless(status == golden_data[i].expected,
- "sdb_store_matcher_matches({{%s, %s},{%s, %s},"
+ "sdb_store_matcher_matches({{%s, %s},"
"{%s, %s, %s, %s}}, <host a>) = %d; expected: %d",
golden_data[i].hostname, golden_data[i].hostname_re,
- golden_data[i].service_name, golden_data[i].service_name_re,
golden_data[i].attr_name, golden_data[i].attr_name_re,
golden_data[i].attr_value, golden_data[i].attr_value_re,
status, golden_data[i].expected);
/* now match the inverted set of objects */
status = sdb_store_matcher_matches(n, obj);
fail_unless(status == !golden_data[i].expected,
- "sdb_store_matcher_matches(NOT{{%s, %s},{%s, %s},"
+ "sdb_store_matcher_matches(NOT{{%s, %s},"
"{%s, %s, %s, %s}}, <host a>) = %d; expected: %d",
golden_data[i].hostname, golden_data[i].hostname_re,
- golden_data[i].service_name, golden_data[i].service_name_re,
golden_data[i].attr_name, golden_data[i].attr_name_re,
golden_data[i].attr_value, golden_data[i].attr_value_re,
status, !golden_data[i].expected);
{
sdb_store_base_t *obj;
- sdb_store_matcher_t *always = sdb_store_host_matcher(NULL, NULL, NULL, NULL);
- sdb_store_matcher_t *never = sdb_store_host_matcher("a", "b", NULL, NULL);
+ sdb_store_matcher_t *always = sdb_store_host_matcher(NULL, NULL, NULL);
+ sdb_store_matcher_t *never = sdb_store_host_matcher("a", "b", NULL);
struct {
const char *op;
{ "attribute.name = 'x'", 0,
"OBJ\\[attribute\\]\\{ NAME\\{ 'x', \\(nil\\) \\}" },
{ "attribute.k1 = 'v1'", 1,
- "HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, SERVICE\\{\\}, ATTR\\{ "
+ "HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, ATTR\\{ "
"NAME\\{ 'k1', \\(nil\\) }, VALUE\\{ 'v1', \\(nil\\) \\} "
"\\} \\}" },
{ "attribute.k1 != 'v1'", 2,
- "\\(NOT, HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, SERVICE\\{\\}, ATTR\\{ "
+ "\\(NOT, HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, ATTR\\{ "
"NAME\\{ 'k1', \\(nil\\) }, VALUE\\{ 'v1', \\(nil\\) \\} "
"\\} \\})" },
{ "attribute.k1 != 'v2'", 3,
- "\\(NOT, HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, SERVICE\\{\\}, ATTR\\{ "
+ "\\(NOT, HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, ATTR\\{ "
"NAME\\{ 'k1', \\(nil\\) }, VALUE\\{ 'v2', \\(nil\\) \\} "
"\\} \\})" },
{ "attribute.name != 'x' "
"AND attribute.y !~ 'x'", 3,
"\\(AND, \\(NOT, OBJ\\[attribute\\]\\{ NAME\\{ 'x', \\(nil\\) \\} "
- "\\}\\), \\(NOT, HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, SERVICE\\{\\}, ATTR\\{ "
+ "\\}\\), \\(NOT, HOST\\{ NAME\\{ NULL, \\(nil\\) \\}, ATTR\\{ "
"NAME\\{ 'y', \\(nil\\) }, VALUE\\{ NULL, "PTR_RE" \\} "
"\\} \\}\\)\\)" },
};