From: Sebastian Harl Date: Thu, 28 Nov 2013 16:47:04 +0000 (+0100) Subject: store: Replaced store_dump() with store_tojson(). X-Git-Tag: sysdb-0.1.0~336^2~4 X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=commitdiff_plain;h=e2d94a3eba924a4fd3c79d1ed99a57ae8bfb9282 store: Replaced store_dump() with store_tojson(). The new function serializes the store as JSON and writes the result to a string buffer. --- diff --git a/src/core/store.c b/src/core/store.c index 19faee4..be307c5 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -446,11 +446,11 @@ sdb_store_service(const char *hostname, const char *name, /* TODO: actually support hierarchical data */ int -sdb_store_dump(FILE *fh) +sdb_store_tojson(sdb_strbuf_t *buf) { sdb_llist_iter_t *host_iter; - if (! fh) + if (! buf) return -1; pthread_rwlock_rdlock(&obj_lock); @@ -461,6 +461,8 @@ sdb_store_dump(FILE *fh) return -1; } + sdb_strbuf_append(buf, "{\"hosts\":["); + 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; @@ -475,15 +477,17 @@ sdb_store_dump(FILE *fh) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; - fprintf(fh, "Host '%s' (last updated: %s):\n", + 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]; - fprintf(fh, "Failed to retrieve attributes: %s\n", + sdb_log(SDB_LOG_ERR, "store: Failed to retrieve attributes: %s\n", sdb_strerror(errno, errbuf, sizeof(errbuf))); - continue; + break; } while (sdb_llist_iter_has_next(attr_iter)) { @@ -495,18 +499,20 @@ sdb_store_dump(FILE *fh) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; - fprintf(fh, "\tAttribute '%s' -> '%s' (last updated: %s)\n", + sdb_strbuf_append(buf, "{\"name\": \"%s\", " + "\"value\": \"%s\", \"last_update\": \"%s\"},", SDB_OBJ(attr)->name, attr->value, time_str); } 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]; - fprintf(fh, "Failed to retrieve services: %s\n", + sdb_log(SDB_LOG_ERR, "store: Failed to retrieve services: %s\n", sdb_strerror(errno, errbuf, sizeof(errbuf))); - continue; + break; } while (sdb_llist_iter_has_next(svc_iter)) { @@ -518,17 +524,21 @@ sdb_store_dump(FILE *fh) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; - fprintf(fh, "\tService '%s' (last updated: %s)\n", + sdb_strbuf_append(buf, "{\"name\": \"%s\", " + "\"last_update\": \"%s\"},", SDB_OBJ(svc)->name, time_str); } sdb_llist_iter_destroy(svc_iter); + sdb_strbuf_append(buf, "]}"); } + sdb_strbuf_append(buf, "]}"); + sdb_llist_iter_destroy(host_iter); pthread_rwlock_unlock(&obj_lock); return 0; -} /* sdb_store_dump */ +} /* sdb_store_tojson */ /* vim: set tw=78 sw=4 ts=4 noexpandtab : */ diff --git a/src/daemon/sysdbd.c b/src/daemon/sysdbd.c index e230922..123314d 100644 --- a/src/daemon/sysdbd.c +++ b/src/daemon/sysdbd.c @@ -287,9 +287,6 @@ main(int argc, char **argv) sdb_log(SDB_LOG_INFO, "Shutting down SysDB daemon "SDB_VERSION_STRING SDB_VERSION_EXTRA" (pid %i)", (int)getpid()); - - fprintf(stderr, "Store dump:\n"); - sdb_store_dump(stderr); return 0; } /* main */ diff --git a/src/include/core/store.h b/src/include/core/store.h index 538390a..bef29ba 100644 --- a/src/include/core/store.h +++ b/src/include/core/store.h @@ -32,6 +32,7 @@ #include "core/object.h" #include "core/time.h" #include "utils/llist.h" +#include "utils/strbuf.h" #include @@ -98,8 +99,17 @@ int sdb_store_service(const char *hostname, const char *name, sdb_time_t last_update); +/* + * sdb_store_tojson: + * Serialize the entire store to JSON and write the result to the specified + * buffer. + * + * Returns: + * - 0 on success + * - a negative value on error + */ int -sdb_store_dump(FILE *fh); +sdb_store_tojson(sdb_strbuf_t *buf); #ifdef __cplusplus } /* extern "C" */