From: Sebastian Harl Date: Thu, 26 Jun 2014 20:55:47 +0000 (+0200) Subject: store: Simplified object update based on having hosts on the toplevel only. X-Git-Tag: sysdb-0.2.0~30 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=13052a811a0689bb150be81642721ac0c375becb;p=sysdb.git store: Simplified object update based on having hosts on the toplevel only. --- diff --git a/src/core/store.c b/src/core/store.c index 4e642de..5a80a31 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -49,7 +49,7 @@ * private variables */ -static sdb_llist_t *obj_list = NULL; +static sdb_llist_t *host_list = NULL; static pthread_rwlock_t obj_lock = PTHREAD_RWLOCK_INITIALIZER; /* @@ -201,16 +201,15 @@ store_lookup_in_list(sdb_llist_t *l, int type, const char *name) static sdb_store_obj_t * store_lookup(int type, const char *name) { - return store_lookup_in_list(obj_list, type, name); + return store_lookup_in_list(host_list, type, name); } /* store_lookup */ /* The obj_lock has to be acquired before calling this function. */ static int -store_obj(int parent_type, const char *parent_name, - int type, const char *name, sdb_time_t last_update, - sdb_store_base_t **updated_obj) +store_obj(const char *hostname, int type, const char *name, + sdb_time_t last_update, sdb_store_base_t **updated_obj) { - char *parent_cname = NULL, *cname = NULL; + char *host_cname = NULL, *cname = NULL; sdb_llist_t *parent_list; sdb_store_base_t *old; @@ -219,22 +218,16 @@ store_obj(int parent_type, const char *parent_name, if (last_update <= 0) last_update = sdb_gettime(); - assert((parent_type == 0) - || (parent_type == SDB_HOST) - || (parent_type == SDB_SERVICE)); assert((type == 0) || (type == SDB_HOST) || (type == SDB_SERVICE) || (type == SDB_ATTRIBUTE)); - if (parent_type == SDB_HOST) { - parent_cname = sdb_plugin_cname(strdup(parent_name)); - if (! parent_cname) { - sdb_log(SDB_LOG_ERR, "store: strdup failed"); + if (! host_list) + if (! (host_list = sdb_llist_create())) return -1; - } - parent_name = parent_cname; - } + parent_list = host_list; + if (type == SDB_HOST) { cname = sdb_plugin_cname(strdup(name)); if (! cname) { @@ -244,24 +237,23 @@ store_obj(int parent_type, const char *parent_name, name = cname; } - if (! obj_list) { - if (! (obj_list = sdb_llist_create())) { - free(parent_cname); + if (hostname) { + sdb_store_obj_t *parent; + + host_cname = sdb_plugin_cname(strdup(hostname)); + if (! host_cname) { + sdb_log(SDB_LOG_ERR, "store: strdup failed"); free(cname); return -1; } - } - parent_list = obj_list; - - if (parent_type && parent_name) { - sdb_store_obj_t *parent; + hostname = host_cname; - parent = store_lookup(parent_type, parent_name); + parent = store_lookup(SDB_HOST, hostname); if (! parent) { sdb_log(SDB_LOG_ERR, "store: Failed to store %s '%s' - " - "parent %s '%s' not found", SDB_STORE_TYPE_TO_NAME(type), - name, SDB_STORE_TYPE_TO_NAME(parent_type), parent_name); - free(parent_cname); + "host '%s' not found", SDB_STORE_TYPE_TO_NAME(type), + name, hostname); + free(host_cname); free(cname); return -1; } @@ -274,7 +266,7 @@ store_obj(int parent_type, const char *parent_name, if (type == SDB_HOST) /* make sure that each host is unique */ - old = STORE_BASE(store_lookup_in_list(obj_list, type, name)); + old = STORE_BASE(store_lookup_in_list(host_list, type, name)); else if (type == SDB_ATTRIBUTE) /* look into attributes of this host */ old = STORE_BASE(sdb_llist_search_by_name(parent_list, name)); @@ -324,13 +316,11 @@ store_obj(int parent_type, const char *parent_name, sdb_log(SDB_LOG_ERR, "store: Failed to create %s '%s': %s", SDB_STORE_TYPE_TO_NAME(type), name, sdb_strerror(errno, errbuf, sizeof(errbuf))); - free(parent_cname); + free(host_cname); free(cname); return -1; } - /* TODO: insert type-aware; the current version works as long as we - * don't support to store hierarchical data */ status = sdb_llist_insert_sorted(parent_list, SDB_OBJ(new), sdb_object_cmp_by_name); @@ -340,7 +330,7 @@ store_obj(int parent_type, const char *parent_name, if (updated_obj) *updated_obj = new; } - free(parent_cname); + free(host_cname); free(cname); return status; } /* store_obj */ @@ -415,8 +405,8 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) void sdb_store_clear(void) { - sdb_llist_destroy(obj_list); - obj_list = NULL; + sdb_llist_destroy(host_list); + host_list = NULL; } /* sdb_store_clear */ int @@ -428,7 +418,7 @@ sdb_store_host(const char *name, sdb_time_t last_update) return -1; pthread_rwlock_wrlock(&obj_lock); - status = store_obj(/* parent = */ 0, NULL, + status = store_obj(/* hostname = */ NULL, /* stored object = */ SDB_HOST, name, last_update, /* updated_obj = */ NULL); pthread_rwlock_unlock(&obj_lock); @@ -476,7 +466,7 @@ sdb_store_attribute(const char *hostname, return -1; pthread_rwlock_wrlock(&obj_lock); - status = store_obj(/* parent = */ SDB_HOST, hostname, + status = store_obj(hostname, /* stored object = */ SDB_ATTRIBUTE, key, last_update, &updated_attr); @@ -503,7 +493,7 @@ sdb_store_service(const char *hostname, const char *name, return -1; pthread_rwlock_wrlock(&obj_lock); - status = store_obj(/* parent = */ SDB_HOST, hostname, + status = store_obj(hostname, /* stored object = */ SDB_SERVICE, name, last_update, /* updated obj = */ NULL); pthread_rwlock_unlock(&obj_lock); @@ -560,7 +550,7 @@ sdb_store_tojson(sdb_strbuf_t *buf, int flags) pthread_rwlock_rdlock(&obj_lock); - host_iter = sdb_llist_get_iter(obj_list); + host_iter = sdb_llist_get_iter(host_list); if (! host_iter) { pthread_rwlock_unlock(&obj_lock); return -1; @@ -595,7 +585,7 @@ sdb_store_iterate(sdb_store_iter_cb cb, void *user_data) pthread_rwlock_rdlock(&obj_lock); - host_iter = sdb_llist_get_iter(obj_list); + host_iter = sdb_llist_get_iter(host_list); if (! host_iter) status = -1;