X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fstore.c;h=dace58f899f78ac27d681f22927ed088a7850170;hb=fdfe2a68ba1838cdb1c34d3275d129fb217fbd9d;hp=dc27eb48cd042c34b7bf9e101fd39dd8348ec85a;hpb=e990840022affb61add5682b7a60ba6dba89fbf2;p=sysdb.git diff --git a/src/core/store.c b/src/core/store.c index dc27eb4..dace58f 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -25,6 +25,10 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + #include "sysdb.h" #include "core/store-private.h" #include "core/plugin.h" @@ -63,6 +67,7 @@ store_base_init(sdb_object_t *obj, va_list ap) sobj->type = va_arg(ap, int); sobj->last_update = va_arg(ap, sdb_time_t); + sobj->interval = 0; sobj->parent = NULL; return 0; } /* store_base_init */ @@ -288,7 +293,15 @@ store_obj(int parent_type, const char *parent_name, status = 1; } else { + sdb_time_t interval = last_update - old->last_update; old->last_update = last_update; + if (interval) { + if (old->interval) + old->interval = (sdb_time_t)((0.9 * (double)old->interval) + + (0.1 * (double)interval)); + else + old->interval = interval; + } } if (updated_obj) @@ -342,6 +355,7 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) { sdb_llist_iter_t *iter; char time_str[64]; + char interval_str[64]; assert((type == SDB_ATTRIBUTE) || (type == SDB_SERVICE)); @@ -367,15 +381,23 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; + if (! sdb_strfinterval(interval_str, sizeof(interval_str), + sobj->interval)) + snprintf(interval_str, sizeof(interval_str), ""); + interval_str[sizeof(interval_str) - 1] = '\0'; + sdb_strbuf_append(buf, "{\"name\": \"%s\", ", SDB_OBJ(sobj)->name); if (type == SDB_ATTRIBUTE) { char tmp[sdb_data_strlen(&SDB_ATTR(sobj)->value) + 1]; - sdb_data_format(&SDB_ATTR(sobj)->value, tmp, sizeof(tmp)); - sdb_strbuf_append(buf, "\"value\": %s, \"last_update\": \"%s\"}", - tmp, time_str); + sdb_data_format(&SDB_ATTR(sobj)->value, tmp, sizeof(tmp), + SDB_DOUBLE_QUOTED); + sdb_strbuf_append(buf, "\"value\": %s, \"last_update\": \"%s\", " + "\"update_interval\": \"%s\"}", tmp, time_str, + interval_str); } else - sdb_strbuf_append(buf, "\"last_update\": \"%s\"}", time_str); + sdb_strbuf_append(buf, "\"last_update\": \"%s\", " + "\"update_interval\": \"%s\"}", time_str, interval_str); if (sdb_llist_iter_has_next(iter)) sdb_strbuf_append(buf, ","); @@ -389,6 +411,13 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) * public API */ +void +sdb_store_clear(void) +{ + sdb_llist_destroy(obj_list); + obj_list = NULL; +} /* sdb_store_clear */ + int sdb_store_host(const char *name, sdb_time_t last_update) { @@ -484,6 +513,7 @@ sdb_store_host_tojson(sdb_store_base_t *h, sdb_strbuf_t *buf, int flags) { sdb_store_obj_t *host; char time_str[64]; + char interval_str[64]; if ((! h) || (h->type != SDB_HOST) || (! buf)) return -1; @@ -495,9 +525,14 @@ sdb_store_host_tojson(sdb_store_base_t *h, sdb_strbuf_t *buf, int flags) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; + if (! sdb_strfinterval(interval_str, sizeof(interval_str), + host->_interval)) + snprintf(interval_str, sizeof(interval_str), ""); + interval_str[sizeof(interval_str) - 1] = '\0'; + sdb_strbuf_append(buf, "{\"name\": \"%s\", " - "\"last_update\": \"%s\"", - SDB_OBJ(host)->name, time_str); + "\"last_update\": \"%s\", \"update_interval\": \"%s\"", + SDB_OBJ(host)->name, time_str, interval_str); if (! (flags & SDB_SKIP_ATTRIBUTES)) { sdb_strbuf_append(buf, ", \"attributes\": "); @@ -513,7 +548,6 @@ sdb_store_host_tojson(sdb_store_base_t *h, sdb_strbuf_t *buf, int flags) return 0; } /* sdb_store_host_tojson */ -/* TODO: actually support hierarchical data */ int sdb_store_tojson(sdb_strbuf_t *buf, int flags) { @@ -550,5 +584,34 @@ sdb_store_tojson(sdb_strbuf_t *buf, int flags) return 0; } /* sdb_store_tojson */ +/* TODO: actually support hierarchical data */ +int +sdb_store_iterate(sdb_store_iter_cb cb, void *user_data) +{ + sdb_llist_iter_t *host_iter; + int status = 0; + + pthread_rwlock_rdlock(&obj_lock); + + host_iter = sdb_llist_get_iter(obj_list); + if (! host_iter) + status = -1; + + /* has_next returns false if the iterator is NULL */ + while (sdb_llist_iter_has_next(host_iter)) { + sdb_store_base_t *host = STORE_BASE(sdb_llist_iter_get_next(host_iter)); + assert(host); + + if (cb(host, user_data)) { + status = -1; + break; + } + } + + sdb_llist_iter_destroy(host_iter); + pthread_rwlock_unlock(&obj_lock); + return status; +} /* sdb_store_iterate */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */