summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9ee6c7f)
raw | patch | inline | side by side (parent: 9ee6c7f)
author | Sebastian Harl <sh@tokkee.org> | |
Wed, 29 Jan 2014 20:55:58 +0000 (21:55 +0100) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Wed, 29 Jan 2014 20:55:58 +0000 (21:55 +0100) |
An attribute value is now stored as sdb_data_t, supporting all data-types
which are supported by that type.
JSON-serialization does not fully support that yet, though.
which are supported by that type.
JSON-serialization does not fully support that yet, though.
src/backend/puppet/store-configs.c | patch | blob | history | |
src/core/store.c | patch | blob | history | |
src/include/core/store.h | patch | blob | history | |
t/core/store_test.c | patch | blob | history |
index a9a0ff777e9d6f35bd364885832b485d1f88beef..e109b305819cfcec5fb1d7f32403241ed519d69b 100644 (file)
const char *hostname;
const char *key;
- const char *value;
+ sdb_data_t value;
sdb_time_t last_update;
assert(n == 4);
hostname = data[0].data.string;
key = data[1].data.string;
- value = data[2].data.string;
+ value.type = SDB_TYPE_STRING;
+ value.data.string = data[2].data.string;
last_update = data[3].data.datetime;
- status = sdb_store_attribute(hostname, key, value, last_update);
+ status = sdb_store_attribute(hostname, key, &value, last_update);
if (status < 0) {
sdb_log(SDB_LOG_ERR, "puppet::store-configs backend: Failed to "
diff --git a/src/core/store.c b/src/core/store.c
index e8d14a079679a12d5a76ef58735b44920065755d..2522233112a8d125024d9853710ff90565f768d4 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
typedef struct {
sdb_store_base_t super;
- char *value;
+ sdb_data_t value;
} sdb_attribute_t;
#define SDB_ATTR(obj) ((sdb_attribute_t *)(obj))
#define SDB_CONST_ATTR(obj) ((const sdb_attribute_t *)(obj))
static int
sdb_attr_init(sdb_object_t *obj, va_list ap)
{
- const char *value;
+ const sdb_data_t *value;
int ret;
- /* this will consume the first argument (type) of ap */
+ /* this will consume the first two arguments
+ * (type and last_update) of ap */
ret = store_base_init(obj, ap);
if (ret)
return ret;
- value = va_arg(ap, const char *);
+ value = va_arg(ap, const sdb_data_t *);
- if (value) {
- SDB_ATTR(obj)->value = strdup(value);
- if (! SDB_ATTR(obj)->value)
+ if (value)
+ if (sdb_data_copy(&SDB_ATTR(obj)->value, value))
return -1;
- }
return 0;
} /* sdb_attr_init */
assert(obj);
store_base_destroy(obj);
-
- if (SDB_ATTR(obj)->value)
- free(SDB_ATTR(obj)->value);
+ sdb_data_free_datum(&SDB_ATTR(obj)->value);
} /* sdb_attr_destroy */
static sdb_type_t sdb_store_obj_type = {
sdb_strbuf_append(buf, "{\"name\": \"%s\", ", SDB_OBJ(sobj)->name);
if (type == SDB_ATTRIBUTE)
+ /* XXX: this needs to be type-dependent */
sdb_strbuf_append(buf, "\"value\": \"%s\", ",
- SDB_ATTR(sobj)->value);
+ SDB_ATTR(sobj)->value.data.string);
sdb_strbuf_append(buf, "\"last_update\": \"%s\"}", time_str);
if (sdb_llist_iter_has_next(iter))
} /* sdb_store_get_host */
int
-sdb_store_attribute(const char *hostname, const char *key, const char *value,
+sdb_store_attribute(const char *hostname,
+ const char *key, const sdb_data_t *value,
sdb_time_t last_update)
{
int status;
if (status >= 0) {
assert(updated_attr);
- SDB_ATTR(updated_attr)->value = strdup(value);
- if (! SDB_ATTR(updated_attr)->value) {
+ if (sdb_data_copy(&SDB_ATTR(updated_attr)->value, value)) {
sdb_object_deref(SDB_OBJ(updated_attr));
status = -1;
}
index ab11a21776a193a460da5e3a8e100b4d1f25cff7..100aadf260700bdbb0c77f59c16cfedd0ca50048 100644 (file)
--- a/src/include/core/store.h
+++ b/src/include/core/store.h
#include "sysdb.h"
#include "core/object.h"
+#include "core/data.h"
#include "core/time.h"
#include "utils/llist.h"
#include "utils/strbuf.h"
* - a negative value on error
*/
int
-sdb_store_attribute(const char *hostname, const char *key, const char *value,
+sdb_store_attribute(const char *hostname,
+ const char *key, const sdb_data_t *value,
sdb_time_t last_update);
/*
diff --git a/t/core/store_test.c b/t/core/store_test.c
index effd05a7d5d8425f89b5f8db7d9f6d818b490940..855c8c09e857b4b821e022bda2ec5f23d525856f 100644 (file)
--- a/t/core/store_test.c
+++ b/t/core/store_test.c
struct {
const char *host;
const char *key;
- const char *value;
+ char *value;
sdb_time_t last_update;
int expected;
} golden_data[] = {
sdb_store_host("l", 1);
sdb_store_host("m", 1);
for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+ sdb_data_t datum;
int status;
+ /* XXX: test other types as well */
+ datum.type = SDB_TYPE_STRING;
+ datum.data.string = golden_data[i].value;
+
status = sdb_store_attribute(golden_data[i].host,
- golden_data[i].key, golden_data[i].value,
+ golden_data[i].key, &datum,
golden_data[i].last_update);
fail_unless(status == golden_data[i].expected,
"sdb_store_attribute(%s, %s, %s, %d) = %d; expected: %d",
START_TEST(test_store_tojson)
{
sdb_strbuf_t *buf;
+ sdb_data_t datum;
size_t i;
struct {
sdb_store_host("h1", 1);
sdb_store_host("h2", 1);
- sdb_store_attribute("h1", "k1", "v1", 1);
- sdb_store_attribute("h1", "k2", "v2", 1);
- sdb_store_attribute("h1", "k3", "v3", 1);
+ datum.type = SDB_TYPE_STRING;
+ datum.data.string = "v1";
+ sdb_store_attribute("h1", "k1", &datum, 1);
+ datum.data.string = "v2";
+ sdb_store_attribute("h1", "k2", &datum, 1);
+ datum.data.string = "v3";
+ sdb_store_attribute("h1", "k3", &datum, 1);
sdb_store_service("h2", "s1", 1);
sdb_store_service("h2", "s2", 1);