summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ad77b3e)
raw | patch | inline | side by side (parent: ad77b3e)
author | Sebastian Harl <sh@tokkee.org> | |
Fri, 3 Jan 2014 12:50:34 +0000 (13:50 +0100) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Fri, 3 Jan 2014 12:50:34 +0000 (13:50 +0100) |
src/core/store.c | patch | blob | history | |
src/include/core/store.h | patch | blob | history | |
t/core/store_test.c | patch | blob | history |
diff --git a/src/core/store.c b/src/core/store.c
index e0c1ac6e6ede64893cac4d63e52b7892a6434ed6..50b39d52f1160791cee05ecb5b3a44867380eece 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
return status;
} /* sdb_store_service */
-/* TODO: actually support hierarchical data */
int
-sdb_store_tojson(sdb_strbuf_t *buf)
+sdb_store_host_tojson(sdb_store_base_t *h, sdb_strbuf_t *buf)
{
- sdb_llist_iter_t *host_iter;
+ sdb_store_obj_t *host;
- if (! buf)
- return -1;
+ sdb_llist_iter_t *svc_iter;
+ sdb_llist_iter_t *attr_iter;
- pthread_rwlock_rdlock(&obj_lock);
+ char time_str[64];
- host_iter = sdb_llist_get_iter(obj_list);
- if (! host_iter) {
- pthread_rwlock_unlock(&obj_lock);
+ if ((! h) || (h->type != SDB_HOST) || (! buf))
return -1;
+
+ host = SDB_STORE_OBJ(h);
+
+ if (! sdb_strftime(time_str, sizeof(time_str),
+ "%F %T %z", host->_last_update))
+ snprintf(time_str, sizeof(time_str), "<error>");
+ time_str[sizeof(time_str) - 1] = '\0';
+
+ sdb_strbuf_append(buf, "{\"name\": \"%s\", "
+ "\"last_update\": \"%s\", "
+ "\"attributes\": [",
+ SDB_OBJ(host)->name, time_str);
+
+ attr_iter = sdb_llist_get_iter(host->attributes);
+ if (! attr_iter) {
+ char errbuf[1024];
+ sdb_log(SDB_LOG_ERR, "store: Failed to retrieve attributes: %s\n",
+ sdb_strerror(errno, errbuf, sizeof(errbuf)));
+ sdb_strbuf_append(buf, "{\"error\": \"failed to retrieve "
+ "attributes: %s\"}", errbuf);
}
- sdb_strbuf_append(buf, "{\"hosts\":[");
+ /* has_next returns false if the iterator is NULL */
+ while (sdb_llist_iter_has_next(attr_iter)) {
+ sdb_attribute_t *attr = SDB_ATTR(sdb_llist_iter_get_next(attr_iter));
+ assert(attr);
- while (sdb_llist_iter_has_next(host_iter)) {
- sdb_store_obj_t *host = SDB_STORE_OBJ(sdb_llist_iter_get_next(host_iter));
- sdb_llist_iter_t *svc_iter;
- sdb_llist_iter_t *attr_iter;
+ if (! sdb_strftime(time_str, sizeof(time_str),
+ "%F %T %z", attr->_last_update))
+ snprintf(time_str, sizeof(time_str), "<error>");
+ time_str[sizeof(time_str) - 1] = '\0';
- char time_str[64];
+ sdb_strbuf_append(buf, "{\"name\": \"%s\", "
+ "\"value\": \"%s\", \"last_update\": \"%s\"},",
+ SDB_OBJ(attr)->name, attr->value, time_str);
+ }
- assert(host);
+ sdb_llist_iter_destroy(attr_iter);
+ sdb_strbuf_append(buf, "], \"services\": [");
+
+ svc_iter = sdb_llist_get_iter(host->children);
+ if (! svc_iter) {
+ char errbuf[1024];
+ sdb_log(SDB_LOG_ERR, "store: Failed to retrieve services: %s\n",
+ sdb_strerror(errno, errbuf, sizeof(errbuf)));
+ sdb_strbuf_append(buf, "{\"error\": \"failed to retrieve "
+ "services: %s\"}", errbuf);
+ }
+
+ while (sdb_llist_iter_has_next(svc_iter)) {
+ sdb_store_obj_t *svc = SDB_STORE_OBJ(sdb_llist_iter_get_next(svc_iter));
+ assert(svc);
if (! sdb_strftime(time_str, sizeof(time_str),
- "%F %T %z", host->_last_update))
+ "%F %T %z", svc->_last_update))
snprintf(time_str, sizeof(time_str), "<error>");
time_str[sizeof(time_str) - 1] = '\0';
sdb_strbuf_append(buf, "{\"name\": \"%s\", "
- "\"last_update\": \"%s\", "
- "\"attributes\": [",
- SDB_OBJ(host)->name, time_str);
-
- attr_iter = sdb_llist_get_iter(host->attributes);
- if (! attr_iter) {
- char errbuf[1024];
- sdb_log(SDB_LOG_ERR, "store: Failed to retrieve attributes: %s\n",
- sdb_strerror(errno, errbuf, sizeof(errbuf)));
- sdb_strbuf_append(buf, "{\"error\": \"failed to retrieve "
- "attributes: %s\"}", errbuf);
- }
+ "\"last_update\": \"%s\"},",
+ SDB_OBJ(svc)->name, time_str);
+ }
- /* has_next returns false if the iterator is NULL */
- while (sdb_llist_iter_has_next(attr_iter)) {
- sdb_attribute_t *attr = SDB_ATTR(sdb_llist_iter_get_next(attr_iter));
- assert(attr);
+ sdb_llist_iter_destroy(svc_iter);
+ sdb_strbuf_append(buf, "]}");
+ return 0;
+} /* sdb_store_host_tojson */
- if (! sdb_strftime(time_str, sizeof(time_str),
- "%F %T %z", attr->_last_update))
- snprintf(time_str, sizeof(time_str), "<error>");
- time_str[sizeof(time_str) - 1] = '\0';
+/* TODO: actually support hierarchical data */
+int
+sdb_store_tojson(sdb_strbuf_t *buf)
+{
+ sdb_llist_iter_t *host_iter;
- sdb_strbuf_append(buf, "{\"name\": \"%s\", "
- "\"value\": \"%s\", \"last_update\": \"%s\"},",
- SDB_OBJ(attr)->name, attr->value, time_str);
- }
+ if (! buf)
+ return -1;
- sdb_llist_iter_destroy(attr_iter);
- sdb_strbuf_append(buf, "], \"services\": [");
+ pthread_rwlock_rdlock(&obj_lock);
- svc_iter = sdb_llist_get_iter(host->children);
- if (! svc_iter) {
- char errbuf[1024];
- sdb_log(SDB_LOG_ERR, "store: Failed to retrieve services: %s\n",
- sdb_strerror(errno, errbuf, sizeof(errbuf)));
- sdb_strbuf_append(buf, "{\"error\": \"failed to retrieve "
- "services: %s\"}", errbuf);
- }
+ host_iter = sdb_llist_get_iter(obj_list);
+ if (! host_iter) {
+ pthread_rwlock_unlock(&obj_lock);
+ return -1;
+ }
- while (sdb_llist_iter_has_next(svc_iter)) {
- sdb_store_obj_t *svc = SDB_STORE_OBJ(sdb_llist_iter_get_next(svc_iter));
- assert(svc);
+ sdb_strbuf_append(buf, "{\"hosts\":[");
- if (! sdb_strftime(time_str, sizeof(time_str),
- "%F %T %z", svc->_last_update))
- snprintf(time_str, sizeof(time_str), "<error>");
- time_str[sizeof(time_str) - 1] = '\0';
+ while (sdb_llist_iter_has_next(host_iter)) {
+ sdb_store_base_t *host = STORE_BASE(sdb_llist_iter_get_next(host_iter));
+ assert(host);
- sdb_strbuf_append(buf, "{\"name\": \"%s\", "
- "\"last_update\": \"%s\"},",
- SDB_OBJ(svc)->name, time_str);
- }
+ if (sdb_store_host_tojson(host, buf))
+ return -1;
- sdb_llist_iter_destroy(svc_iter);
- sdb_strbuf_append(buf, "]},");
+ if (sdb_llist_iter_has_next(host_iter))
+ sdb_strbuf_append(buf, ",");
}
sdb_strbuf_append(buf, "]}");
index 5558e77154f32f00e9d59edf75ea3d1f0a014119..99b2ead200cce151cc6775882903b6235fe042fc 100644 (file)
--- a/src/include/core/store.h
+++ b/src/include/core/store.h
int
sdb_store_tojson(sdb_strbuf_t *buf);
+/*
+ * sdb_store_host_tojson:
+ * Serialize a host object to JSON and append the result to the specified
+ * buffer.
+ *
+ * Returns:
+ * - 0 on success
+ * - a negative value on error
+ */
+int
+sdb_store_host_tojson(sdb_store_base_t *host, sdb_strbuf_t *buf);
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/t/core/store_test.c b/t/core/store_test.c
index afc532369114495a2a6ec96997507f2185a69386..c27310d4e6720dd5819483e00af7668f3e498287 100644 (file)
--- a/t/core/store_test.c
+++ b/t/core/store_test.c
"\"services\": ["
"{\"name\": \"s1\", \"last_update\": \"1970-01-01 00:00:00 +0000\"},"
"{\"name\": \"s2\", \"last_update\": \"1970-01-01 00:00:00 +0000\"},"
- "]},"
+ "]}"
"]}";
sdb_store_host("h1", 1);