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, "]}");