From da52b4da948c741d20c7a3995ce5d133af377def Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sat, 14 Mar 2015 22:05:50 -0400 Subject: [PATCH] store: Added field type VALUE for attribute values. --- src/core/store.c | 6 +++ src/core/store_expr.c | 9 ++++- src/core/store_lookup.c | 2 + src/include/core/store.h | 6 ++- t/unit/core/store_test.c | 86 ++++++++++++++++++++++++++++++---------- 5 files changed, 84 insertions(+), 25 deletions(-) diff --git a/src/core/store.c b/src/core/store.c index 1eb7ed1..ab37e68 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -904,6 +904,12 @@ sdb_store_get_field(sdb_store_obj_t *obj, int field, sdb_data_t *res) tmp.data.array.length = obj->backends_num; tmp.data.array.values = obj->backends; return sdb_data_copy(res, &tmp); + case SDB_FIELD_VALUE: + if (obj->type != SDB_ATTRIBUTE) + return -1; + if (! res) + return 0; + return sdb_data_copy(res, &ATTR(obj)->value); default: return -1; } diff --git a/src/core/store_expr.c b/src/core/store_expr.c index 60b0bea..6e39305 100644 --- a/src/core/store_expr.c +++ b/src/core/store_expr.c @@ -167,7 +167,7 @@ sdb_store_expr_fieldvalue(int field) sdb_data_t value = { SDB_TYPE_INTEGER, { .integer = field } }; sdb_store_expr_t *e; - if ((field < SDB_FIELD_NAME) || (SDB_FIELD_BACKEND < field)) + if ((field < SDB_FIELD_NAME) || (SDB_FIELD_VALUE < field)) return NULL; e = SDB_STORE_EXPR(sdb_object_create("store-fieldvalue", expr_type, FIELD_VALUE, NULL, NULL, &value)); @@ -286,7 +286,12 @@ sdb_store_expr_iterable(sdb_store_expr_t *expr, int context) if ((context != SDB_HOST) && (context != SDB_SERVICE) && (context != SDB_METRIC) && (context != SDB_ATTRIBUTE)) return 0; - return expr->data.data.integer == SDB_FIELD_BACKEND; + if (expr->data.data.integer == SDB_FIELD_BACKEND) + return 1; + else if (expr->data.data.integer == SDB_FIELD_VALUE) + /* we don't current support this just like when using + * the attribute[] syntax */ + return 0; } else if (! expr->type) { return !!(expr->data.type & SDB_TYPE_ARRAY); diff --git a/src/core/store_lookup.c b/src/core/store_lookup.c index 9192618..18a0235 100644 --- a/src/core/store_lookup.c +++ b/src/core/store_lookup.c @@ -705,6 +705,8 @@ sdb_store_parse_field_name(const char *name) return SDB_FIELD_INTERVAL; else if (! strcasecmp(name, "backend")) return SDB_FIELD_BACKEND; + else if (! strcasecmp(name, "value")) + return SDB_FIELD_VALUE; return -1; } /* sdb_store_parse_field_name */ diff --git a/src/include/core/store.h b/src/include/core/store.h index 3722a72..94a5713 100644 --- a/src/include/core/store.h +++ b/src/include/core/store.h @@ -60,6 +60,7 @@ enum { SDB_FIELD_AGE, /* type: datetime */ SDB_FIELD_INTERVAL, /* type: datetime */ SDB_FIELD_BACKEND, /* type: array of strings */ + SDB_FIELD_VALUE, /* attributes only; type: type of the value */ }; #define SDB_STORE_TYPE_TO_NAME(t) \ (((t) == SDB_HOST) ? "host" \ @@ -76,7 +77,9 @@ enum { : ((f) == SDB_FIELD_LAST_UPDATE) ? "last-update" \ : ((f) == SDB_FIELD_AGE) ? "age" \ : ((f) == SDB_FIELD_INTERVAL) ? "interval" \ - : ((f) == SDB_FIELD_BACKEND) ? "backend" : "unknown") + : ((f) == SDB_FIELD_BACKEND) ? "backend" \ + : ((f) == SDB_FIELD_VALUE) ? "value" \ + : "unknown") #define SDB_FIELD_TYPE(f) \ (((f) == SDB_FIELD_NAME) ? SDB_TYPE_STRING \ @@ -84,6 +87,7 @@ enum { : ((f) == SDB_FIELD_AGE) ? SDB_TYPE_DATETIME \ : ((f) == SDB_FIELD_INTERVAL) ? SDB_TYPE_DATETIME \ : ((f) == SDB_FIELD_BACKEND) ? (SDB_TYPE_ARRAY | SDB_TYPE_STRING) \ + : ((f) == SDB_FIELD_VALUE) ? -1 /* unknown */ \ : -1) /* diff --git a/t/unit/core/store_test.c b/t/unit/core/store_test.c index 1eb5262..dbf220c 100644 --- a/t/unit/core/store_test.c +++ b/t/unit/core/store_test.c @@ -414,24 +414,53 @@ END_TEST static struct { const char *hostname; + const char *attr; /* optional */ int field; int expected; sdb_data_t value; } get_field_data[] = { - { NULL, 0, -1, { SDB_TYPE_NULL, { 0 } } }, - { NULL, SDB_FIELD_LAST_UPDATE, -1, { SDB_TYPE_NULL, { 0 } } }, - { NULL, SDB_FIELD_NAME, -1, { SDB_TYPE_NULL, { 0 } } }, - { "host", SDB_FIELD_LAST_UPDATE, 0, { SDB_TYPE_DATETIME, { .datetime = 20 } } }, - { "host", SDB_FIELD_INTERVAL, 0, { SDB_TYPE_DATETIME, { .datetime = 10 } } }, + { NULL, NULL, 0, -1, { SDB_TYPE_NULL, { 0 } } }, + { NULL, NULL, SDB_FIELD_LAST_UPDATE, -1, { SDB_TYPE_NULL, { 0 } } }, + { NULL, NULL, SDB_FIELD_INTERVAL, -1, { SDB_TYPE_NULL, { 0 } } }, + { NULL, NULL, SDB_FIELD_AGE, -1, { SDB_TYPE_NULL, { 0 } } }, + { NULL, NULL, SDB_FIELD_NAME, -1, { SDB_TYPE_NULL, { 0 } } }, + { NULL, NULL, SDB_FIELD_BACKEND, -1, { SDB_TYPE_NULL, { 0 } } }, + { NULL, NULL, SDB_FIELD_VALUE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", NULL, SDB_FIELD_LAST_UPDATE, 0, { SDB_TYPE_DATETIME, { .datetime = 20 } } }, + { "host", NULL, SDB_FIELD_INTERVAL, 0, { SDB_TYPE_DATETIME, { .datetime = 10 } } }, /* the test will handle AGE specially */ - { "host", SDB_FIELD_AGE, 0, { SDB_TYPE_NULL, { 0 } } }, - { "host", SDB_FIELD_NAME, 0, { SDB_TYPE_STRING, { .string = "host" } } }, - { "host", SDB_FIELD_BACKEND, 0, { SDB_TYPE_ARRAY | SDB_TYPE_STRING, { .array = { 0, NULL } } } }, + { "host", NULL, SDB_FIELD_AGE, 0, { SDB_TYPE_NULL, { 0 } } }, + { "host", NULL, SDB_FIELD_NAME, 0, { SDB_TYPE_STRING, { .string = "host" } } }, + { "host", NULL, SDB_FIELD_BACKEND, 0, { SDB_TYPE_ARRAY | SDB_TYPE_STRING, { .array = { 0, NULL } } } }, + { "host", NULL, SDB_FIELD_VALUE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "attr", SDB_FIELD_LAST_UPDATE, 0, { SDB_TYPE_DATETIME, { .datetime = 20 } } }, + { "host", "attr", SDB_FIELD_INTERVAL, 0, { SDB_TYPE_DATETIME, { .datetime = 10 } } }, + /* the test will handle AGE specially */ + { "host", "attr", SDB_FIELD_AGE, 0, { SDB_TYPE_NULL, { 0 } } }, + { "host", "attr", SDB_FIELD_NAME, 0, { SDB_TYPE_STRING, { .string = "attr" } } }, + { "host", "attr", SDB_FIELD_BACKEND, 0, { SDB_TYPE_ARRAY | SDB_TYPE_STRING, { .array = { 0, NULL } } } }, + { "host", "attr", SDB_FIELD_VALUE, 0, { SDB_TYPE_INTEGER, { .integer = 1 } } }, + { "host", "attr", SDB_FIELD_VALUE, 0, { SDB_TYPE_DECIMAL, { .decimal = 2.0 } } }, + { "host", "attr", SDB_FIELD_VALUE, 0, { SDB_TYPE_STRING, { .string = "foo" } } }, + { "host", "attr", SDB_FIELD_VALUE, 0, { SDB_TYPE_DATETIME, { .datetime = 1234567890L } } }, + { "host", "a", SDB_FIELD_LAST_UPDATE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_INTERVAL, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_AGE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_NAME, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_BACKEND, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_VALUE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_VALUE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_VALUE, -1, { SDB_TYPE_NULL, { 0 } } }, + { "host", "a", SDB_FIELD_VALUE, -1, { SDB_TYPE_NULL, { 0 } } }, }; +/* returns a tuple */ +#define OBJ_NAME(obj) \ + (obj) ? SDB_STORE_TYPE_TO_NAME(obj->type) : "NULL", \ + (obj) ? SDB_OBJ(obj)->name : "" START_TEST(test_get_field) { - sdb_store_obj_t *host = NULL; + sdb_store_obj_t *obj = NULL; sdb_data_t value = SDB_DATA_INIT; char value_str[128], expected_value_str[128]; sdb_time_t now = sdb_gettime(); @@ -439,25 +468,36 @@ START_TEST(test_get_field) sdb_store_host("host", 10); sdb_store_host("host", 20); + sdb_store_attribute("host", "attr", &get_field_data[_i].value, 10); + sdb_store_attribute("host", "attr", &get_field_data[_i].value, 20); if (get_field_data[_i].hostname) { - host = sdb_store_get_host(get_field_data[_i].hostname); - ck_assert(host != NULL); + obj = sdb_store_get_host(get_field_data[_i].hostname); + ck_assert(obj != NULL); + + if (get_field_data[_i].attr) { + sdb_store_obj_t *tmp = sdb_store_get_child(obj, + SDB_ATTRIBUTE, get_field_data[_i].attr); + sdb_object_deref(SDB_OBJ(obj)); + obj = tmp; + } } - check = sdb_store_get_field(host, get_field_data[_i].field, NULL); + check = sdb_store_get_field(obj, get_field_data[_i].field, NULL); fail_unless(check == get_field_data[_i].expected, - "sdb_store_get_field(%s, %s, NULL) = %d; expected: %d", - host ? "" : "NULL", SDB_FIELD_TO_NAME(get_field_data[_i].field), + "sdb_store_get_field(%s %s, %s, NULL) = %d; expected: %d", + OBJ_NAME(obj), SDB_FIELD_TO_NAME(get_field_data[_i].field), check, get_field_data[_i].expected); - check = sdb_store_get_field(host, get_field_data[_i].field, &value); + check = sdb_store_get_field(obj, get_field_data[_i].field, &value); fail_unless(check == get_field_data[_i].expected, - "sdb_store_get_field(%s, %s, ) = %d; expected: %d", - host ? "" : "NULL", SDB_FIELD_TO_NAME(get_field_data[_i].field), + "sdb_store_get_field(%s %s, %s, ) = %d; expected: %d", + OBJ_NAME(obj), SDB_FIELD_TO_NAME(get_field_data[_i].field), check, get_field_data[_i].expected); - if (get_field_data[_i].expected) + if (get_field_data[_i].expected) { + sdb_object_deref(SDB_OBJ(obj)); return; + } if (get_field_data[_i].field == SDB_FIELD_AGE) { get_field_data[_i].value.type = SDB_TYPE_DATETIME; @@ -471,21 +511,23 @@ START_TEST(test_get_field) if (get_field_data[_i].field == SDB_FIELD_AGE) { fail_unless((value.type == SDB_TYPE_DATETIME) && (value.data.datetime >= now), - "sdb_store_get_field(, %s, ) " - "returned value %s; expected >=%s", + "sdb_store_get_field(%s %s, %s, ) " + "returned value %s; expected >=%s", OBJ_NAME(obj), SDB_FIELD_TO_NAME(get_field_data[_i].field), value_str, expected_value_str); } else { fail_unless(! sdb_data_cmp(&value, &get_field_data[_i].value), - "sdb_store_get_field(, %s, ) " - "returned value %s; expected %s", + "sdb_store_get_field(%s %s, %s, ) " + "returned value %s; expected %s", OBJ_NAME(obj), SDB_FIELD_TO_NAME(get_field_data[_i].field), value_str, expected_value_str); } sdb_data_free_datum(&value); + sdb_object_deref(SDB_OBJ(obj)); } END_TEST +#undef OBJ_NAME START_TEST(test_get_child) { -- 2.30.2