diff --git a/src/core/store.c b/src/core/store.c
index e9e0979e72e4db10ec99d34f2596f178c5d19317..d195b8f0e3d029f4bf853910ba4ce05358e85d58 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
/*
* SysDB - src/core/store.c
- * Copyright (C) 2012 Sebastian 'tokkee' Harl <sh@tokkee.org>
+ * Copyright (C) 2012-2013 Sebastian 'tokkee' Harl <sh@tokkee.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
static sdb_type_t sdb_store_obj_type;
static sdb_type_t sdb_attribute_type;
-struct store_obj;
-typedef struct store_obj store_obj_t;
-
-struct store_obj {
+struct sdb_store_base {
sdb_object_t super;
sdb_time_t last_update;
- store_obj_t *parent;
+ sdb_store_base_t *parent;
};
-#define STORE_OBJ(obj) ((store_obj_t *)(obj))
-#define STORE_CONST_OBJ(obj) ((const store_obj_t *)(obj))
+#define STORE_BASE(obj) ((sdb_store_base_t *)(obj))
+#define STORE_CONST_BASE(obj) ((const sdb_store_base_t *)(obj))
typedef struct {
- store_obj_t super;
+ sdb_store_base_t super;
char *value;
} sdb_attribute_t;
#define SDB_CONST_ATTR(obj) ((const sdb_attribute_t *)(obj))
typedef struct {
- store_obj_t super;
+ sdb_store_base_t super;
int type;
sdb_llist_t *children;
#define _last_update super.last_update
static int
-store_obj_init(sdb_object_t *obj, va_list ap)
+store_base_init(sdb_object_t *obj, va_list ap)
{
- store_obj_t *sobj = STORE_OBJ(obj);
+ sdb_store_base_t *sobj = STORE_BASE(obj);
sobj->last_update = va_arg(ap, sdb_time_t);
sobj->parent = NULL;
return 0;
-} /* store_obj_init */
+} /* store_base_init */
static void
-store_obj_destroy(sdb_object_t *obj)
+store_base_destroy(sdb_object_t *obj)
{
- const store_obj_t *sobj = STORE_OBJ(obj);
+ const sdb_store_base_t *sobj = STORE_CONST_BASE(obj);
if (sobj->parent)
sdb_object_deref(SDB_OBJ(sobj->parent));
-} /* store_obj_destroy */
+} /* store_base_destroy */
static int
sdb_store_obj_init(sdb_object_t *obj, va_list ap)
sdb_store_obj_t *sobj = SDB_STORE_OBJ(obj);
int ret;
- ret = store_obj_init(obj, ap);
+ ret = store_base_init(obj, ap);
if (ret)
return ret;
assert(obj);
- store_obj_destroy(obj);
+ store_base_destroy(obj);
if (sobj->children)
sdb_llist_destroy(sobj->children);
const char *value;
int ret;
- ret = store_obj_init(obj, ap);
+ ret = store_base_init(obj, ap);
if (ret)
return ret;
value = va_arg(ap, const char *);
{
assert(obj);
- store_obj_destroy(obj);
+ store_base_destroy(obj);
if (SDB_ATTR(obj)->value)
free(SDB_ATTR(obj)->value);
return sobj;
}
+ /* don't lookups non-host types from hierarchical hosts */
+ if ((type != SDB_HOST) && (sobj->type == SDB_HOST))
+ continue;
+
sobj = sdb_store_lookup_in_list(sobj->children, type, name);
if (sobj) {
sdb_llist_iter_destroy(iter);
static int
store_obj(int parent_type, const char *parent_name,
int type, const char *name, sdb_time_t last_update,
- store_obj_t **updated_obj)
+ sdb_store_base_t **updated_obj)
{
char *parent_cname = NULL, *cname = NULL;
sdb_llist_t *parent_list;
- store_obj_t *old;
+ sdb_store_base_t *old;
int status = 0;
if (last_update <= 0)
parent_list = parent->children;
}
- /* TODO: only look into direct children? */
if (type == SDB_HOST)
/* make sure that each host is unique */
- old = STORE_OBJ(sdb_store_lookup_in_list(obj_list, type, name));
+ old = STORE_BASE(sdb_store_lookup_in_list(obj_list, type, name));
else if (type == SDB_ATTRIBUTE)
- old = STORE_OBJ(sdb_llist_search_by_name(parent_list, name));
+ /* look into attributes of this host */
+ old = STORE_BASE(sdb_llist_search_by_name(parent_list, name));
else
- old = STORE_OBJ(sdb_store_lookup_in_list(parent_list, type, name));
+ /* look into services assigned to this host (sdb_store_lookup_in_list
+ * does not look up services from hierarchical hosts) */
+ old = STORE_BASE(sdb_store_lookup_in_list(parent_list, type, name));
if (old) {
if (old->last_update > last_update) {
*updated_obj = old;
}
else {
- store_obj_t *new;
+ sdb_store_base_t *new;
if (type == SDB_ATTRIBUTE)
/* the value will be updated by the caller */
- new = STORE_OBJ(sdb_object_create(name, sdb_attribute_type,
+ new = STORE_BASE(sdb_object_create(name, sdb_attribute_type,
last_update, NULL));
else
- new = STORE_OBJ(sdb_object_create(name, sdb_store_obj_type,
+ new = STORE_BASE(sdb_object_create(name, sdb_store_obj_type,
last_update, type));
if (! new) {
{
int status;
- store_obj_t *updated_attr = NULL;
+ sdb_store_base_t *updated_attr = NULL;
if ((! hostname) || (! key))
return -1;