summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ea42354)
raw | patch | inline | side by side (parent: ea42354)
author | Sebastian Harl <sh@tokkee.org> | |
Thu, 3 Jul 2014 16:18:54 +0000 (18:18 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Thu, 3 Jul 2014 16:25:03 +0000 (18:25 +0200) |
This avoids a couple of unnecessary checks and will allow to reuse some parts.
src/core/store.c | patch | blob | history | |
src/include/core/store.h | patch | blob | history |
diff --git a/src/core/store.c b/src/core/store.c
index d185431f976de168213aa769ceee8bd2a7f16482..866661a59ee963758db185ab5f3db8b2d7a54710 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
return HOST(sdb_llist_search_by_name(host_list, name));
} /* lookup_host */
-/* The host_lock has to be acquired before calling this function. */
static int
-store_obj(const char *hostname, int type, const char *name,
- sdb_time_t last_update, sdb_store_obj_t **updated_obj)
+record_backend(sdb_store_obj_t *obj)
{
- char *host_cname = NULL, *cname = NULL;
- char **tmp;
-
- sdb_llist_t *parent_list;
- sdb_store_obj_t *old, *new;
const sdb_plugin_info_t *info;
-
- int status = 0;
+ char **tmp;
size_t i;
- if (last_update <= 0)
- last_update = sdb_gettime();
-
- assert((type == 0)
- || (type == SDB_HOST)
- || (type == SDB_SERVICE)
- || (type == SDB_ATTRIBUTE));
-
- assert(hostname || (type == SDB_HOST));
- assert((! hostname)
- || (type == SDB_SERVICE)
- || (type == SDB_ATTRIBUTE));
+ info = sdb_plugin_current();
+ if (! info)
+ return 0;
- if (! host_list)
- if (! (host_list = sdb_llist_create()))
- return -1;
- parent_list = host_list;
+ for (i = 0; i < obj->backends_num; ++i)
+ if (!strcasecmp(obj->backends[i], info->plugin_name))
+ return 0;
- if (type == SDB_HOST) {
- cname = sdb_plugin_cname(strdup(name));
- if (! cname) {
- sdb_log(SDB_LOG_ERR, "store: strdup failed");
- return -1;
- }
- name = cname;
- }
+ tmp = realloc(obj->backends,
+ (obj->backends_num + 1) * sizeof(*obj->backends));
+ if (! tmp)
+ return -1;
- if (hostname) {
- sdb_host_t *host;
+ obj->backends = tmp;
+ obj->backends[obj->backends_num] = strdup(info->plugin_name);
+ if (! obj->backends[obj->backends_num])
+ return -1;
- host_cname = sdb_plugin_cname(strdup(hostname));
- if (! host_cname) {
- sdb_log(SDB_LOG_ERR, "store: strdup failed");
- free(cname);
- return -1;
- }
- hostname = host_cname;
-
- host = lookup_host(hostname);
- if (! host) {
- sdb_log(SDB_LOG_ERR, "store: Failed to store %s '%s' - "
- "host '%s' not found", SDB_STORE_TYPE_TO_NAME(type),
- name, hostname);
- free(host_cname);
- free(cname);
- return -1;
- }
+ ++obj->backends_num;
+ return 0;
+} /* record_backend */
- if (type == SDB_ATTRIBUTE)
- parent_list = host->attributes;
- else
- parent_list = host->services;
- }
+static int
+store_obj(sdb_llist_t *parent_list, int type, const char *name,
+ sdb_time_t last_update, sdb_store_obj_t **updated_obj)
+{
+ sdb_store_obj_t *old, *new;
+ int status = 0;
- if (type == SDB_HOST)
- old = STORE_OBJ(sdb_llist_search_by_name(host_list, name));
- else
- old = STORE_OBJ(sdb_llist_search_by_name(parent_list, name));
+ assert(parent_list);
+ old = STORE_OBJ(sdb_llist_search_by_name(parent_list, name));
if (old) {
if (old->last_update > last_update) {
sdb_log(SDB_LOG_DEBUG, "store: Cannot update %s '%s' - "
}
}
- free(host_cname);
- free(cname);
-
if (status < 0)
return status;
assert(new);
if (updated_obj)
*updated_obj = new;
- info = sdb_plugin_current();
- if (! info)
- return status;
+ if (record_backend(new))
+ return -1;
+ return status;
+} /* store_obj */
- for (i = 0; i < new->backends_num; ++i)
- if (!strcasecmp(new->backends[i], info->plugin_name))
- return status;
+/* The host_lock has to be acquired before calling this function. */
+static int
+store_host_obj(const char *hostname, int type, const char *name,
+ sdb_time_t last_update, sdb_store_obj_t **updated_obj)
+{
+ char *cname = NULL;
+ sdb_host_t *host;
+ sdb_llist_t *parent_list;
- tmp = realloc(new->backends,
- (new->backends_num + 1) * sizeof(*new->backends));
- if (! tmp)
+ int status = 0;
+
+ if (last_update <= 0)
+ last_update = sdb_gettime();
+
+ assert(hostname);
+ assert((type == SDB_SERVICE) || (type == SDB_ATTRIBUTE));
+
+ if (! host_list)
return -1;
- new->backends = tmp;
- new->backends[new->backends_num] = strdup(info->plugin_name);
- if (! new->backends[new->backends_num])
+ cname = sdb_plugin_cname(strdup(hostname));
+ if (! cname) {
+ sdb_log(SDB_LOG_ERR, "store: strdup failed");
+ return -1;
+ }
+
+ host = lookup_host(cname);
+ if (! host) {
+ sdb_log(SDB_LOG_ERR, "store: Failed to store %s '%s' - "
+ "host '%s' not found", SDB_STORE_TYPE_TO_NAME(type),
+ name, hostname);
+ free(cname);
return -1;
+ }
+
+ if (type == SDB_ATTRIBUTE)
+ parent_list = host->attributes;
+ else
+ parent_list = host->services;
- ++new->backends_num;
+ status = store_obj(parent_list, type, name,
+ last_update, updated_obj);
+
+ free(cname);
return status;
-} /* store_obj */
+} /* store_host_obj */
/*
* store_common_tojson serializes common object attributes to JSON.
int
sdb_store_host(const char *name, sdb_time_t last_update)
{
- int status;
+ char *cname = NULL;
+ int status = 0;
if (! name)
return -1;
+ if (last_update <= 0)
+ last_update = sdb_gettime();
+
+ cname = sdb_plugin_cname(strdup(name));
+ if (! cname) {
+ sdb_log(SDB_LOG_ERR, "store: strdup failed");
+ return -1;
+ }
+
pthread_rwlock_wrlock(&host_lock);
- status = store_obj(/* hostname = */ NULL,
- /* stored object = */ SDB_HOST, name, last_update,
- /* updated_obj = */ NULL);
+ if (! host_list)
+ if (! (host_list = sdb_llist_create()))
+ status = -1;
+
+ if (! status)
+ status = store_obj(host_list, SDB_HOST, cname, last_update, NULL);
pthread_rwlock_unlock(&host_lock);
+
+ free(cname);
return status;
} /* sdb_store_host */
return -1;
pthread_rwlock_wrlock(&host_lock);
- status = store_obj(hostname,
- /* stored object = */ SDB_ATTRIBUTE, key, last_update,
+ status = store_host_obj(hostname, SDB_ATTRIBUTE, key, last_update,
&updated_attr);
if (status >= 0) {
return -1;
pthread_rwlock_wrlock(&host_lock);
- status = store_obj(hostname,
- /* stored object = */ SDB_SERVICE, name, last_update,
- /* updated obj = */ NULL);
+ status = store_host_obj(hostname, SDB_SERVICE, name, last_update, NULL);
pthread_rwlock_unlock(&host_lock);
return status;
} /* sdb_store_service */
index 20656b37bdb8dbb0272db666d56dacf20fbf7583..e273e7ca1aedb59702de8014c9efeb2c7ba7ffd9 100644 (file)
--- a/src/include/core/store.h
+++ b/src/include/core/store.h
/*
* sdb_store_service:
- * Add/update a store in the store. If the service, identified by its name,
+ * Add/update a service in the store. If the service, identified by its name,
* already exists for the specified host, it will be updated according to the
* specified 'service' object. If the referenced host does not exist, an error
* will be reported. Else, a new entry will be created in the store. Any