|
@@ -53,6 +53,7 @@ struct object_key {
|
|
|
size_t key_len;
|
|
size_t key_len;
|
|
|
void *value;
|
|
void *value;
|
|
|
size_t value_len;
|
|
size_t value_len;
|
|
|
|
|
+ objdb_value_types_t value_type;
|
|
|
struct list_head list;
|
|
struct list_head list;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -498,12 +499,12 @@ error_exit:
|
|
|
return (-1);
|
|
return (-1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static int object_key_create (
|
|
|
|
|
|
|
+static int object_key_create_typed(
|
|
|
hdb_handle_t object_handle,
|
|
hdb_handle_t object_handle,
|
|
|
- const void *key_name,
|
|
|
|
|
- size_t key_len,
|
|
|
|
|
|
|
+ const char *key_name,
|
|
|
const void *value,
|
|
const void *value,
|
|
|
- size_t value_len)
|
|
|
|
|
|
|
+ size_t value_len,
|
|
|
|
|
+ objdb_value_types_t value_type)
|
|
|
{
|
|
{
|
|
|
struct object_instance *instance;
|
|
struct object_instance *instance;
|
|
|
struct object_key *object_key;
|
|
struct object_key *object_key;
|
|
@@ -511,6 +512,7 @@ static int object_key_create (
|
|
|
struct list_head *list;
|
|
struct list_head *list;
|
|
|
int found = 0;
|
|
int found = 0;
|
|
|
int i;
|
|
int i;
|
|
|
|
|
+ size_t key_len = strlen(key_name);
|
|
|
|
|
|
|
|
objdb_rdlock();
|
|
objdb_rdlock();
|
|
|
|
|
|
|
@@ -574,11 +576,11 @@ static int object_key_create (
|
|
|
if (object_key == 0) {
|
|
if (object_key == 0) {
|
|
|
goto error_put;
|
|
goto error_put;
|
|
|
}
|
|
}
|
|
|
- object_key->key_name = malloc (key_len);
|
|
|
|
|
|
|
+ object_key->key_name = malloc (key_len + 1);
|
|
|
if (object_key->key_name == 0) {
|
|
if (object_key->key_name == 0) {
|
|
|
goto error_put_object;
|
|
goto error_put_object;
|
|
|
}
|
|
}
|
|
|
- memcpy (object_key->key_name, key_name, key_len);
|
|
|
|
|
|
|
+ memcpy (object_key->key_name, key_name, key_len + 1);
|
|
|
list_init (&object_key->list);
|
|
list_init (&object_key->list);
|
|
|
list_add_tail (&object_key->list, &instance->key_head);
|
|
list_add_tail (&object_key->list, &instance->key_head);
|
|
|
}
|
|
}
|
|
@@ -590,6 +592,7 @@ static int object_key_create (
|
|
|
|
|
|
|
|
object_key->key_len = key_len;
|
|
object_key->key_len = key_len;
|
|
|
object_key->value_len = value_len;
|
|
object_key->value_len = value_len;
|
|
|
|
|
+ object_key->value_type = value_type;
|
|
|
|
|
|
|
|
object_key_changed_notification(object_handle, key_name, key_len,
|
|
object_key_changed_notification(object_handle, key_name, key_len,
|
|
|
value, value_len, OBJECT_KEY_CREATED);
|
|
value, value_len, OBJECT_KEY_CREATED);
|
|
@@ -610,6 +613,17 @@ error_exit:
|
|
|
return (-1);
|
|
return (-1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int object_key_create (
|
|
|
|
|
+ hdb_handle_t object_handle,
|
|
|
|
|
+ const void *key_name,
|
|
|
|
|
+ size_t key_len,
|
|
|
|
|
+ const void *value,
|
|
|
|
|
+ size_t value_len)
|
|
|
|
|
+{
|
|
|
|
|
+ return object_key_create_typed (object_handle, key_name,
|
|
|
|
|
+ value, value_len, OBJDB_VALUETYPE_ANY);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int _clear_object(struct object_instance *instance)
|
|
static int _clear_object(struct object_instance *instance)
|
|
|
{
|
|
{
|
|
|
struct list_head *list;
|
|
struct list_head *list;
|
|
@@ -861,18 +875,19 @@ error_exit:
|
|
|
return (-1);
|
|
return (-1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static int object_key_get (
|
|
|
|
|
|
|
+static int object_key_get_typed (
|
|
|
hdb_handle_t object_handle,
|
|
hdb_handle_t object_handle,
|
|
|
- const void *key_name,
|
|
|
|
|
- size_t key_len,
|
|
|
|
|
|
|
+ const char *key_name,
|
|
|
void **value,
|
|
void **value,
|
|
|
- size_t *value_len)
|
|
|
|
|
|
|
+ size_t *value_len,
|
|
|
|
|
+ objdb_value_types_t * type)
|
|
|
{
|
|
{
|
|
|
unsigned int res = 0;
|
|
unsigned int res = 0;
|
|
|
struct object_instance *instance;
|
|
struct object_instance *instance;
|
|
|
struct object_key *object_key = NULL;
|
|
struct object_key *object_key = NULL;
|
|
|
struct list_head *list;
|
|
struct list_head *list;
|
|
|
int found = 0;
|
|
int found = 0;
|
|
|
|
|
+ size_t key_len = strlen(key_name);
|
|
|
|
|
|
|
|
objdb_rdlock();
|
|
objdb_rdlock();
|
|
|
res = hdb_handle_get (&object_instance_database,
|
|
res = hdb_handle_get (&object_instance_database,
|
|
@@ -896,6 +911,7 @@ static int object_key_get (
|
|
|
if (value_len) {
|
|
if (value_len) {
|
|
|
*value_len = object_key->value_len;
|
|
*value_len = object_key->value_len;
|
|
|
}
|
|
}
|
|
|
|
|
+ *type = object_key->value_type;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
res = -1;
|
|
res = -1;
|
|
@@ -910,6 +926,19 @@ error_exit:
|
|
|
return (-1);
|
|
return (-1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int object_key_get (
|
|
|
|
|
+ hdb_handle_t object_handle,
|
|
|
|
|
+ const void *key_name,
|
|
|
|
|
+ size_t key_len,
|
|
|
|
|
+ void **value,
|
|
|
|
|
+ size_t *value_len)
|
|
|
|
|
+{
|
|
|
|
|
+ objdb_value_types_t t;
|
|
|
|
|
+ return object_key_get_typed(object_handle,
|
|
|
|
|
+ key_name,
|
|
|
|
|
+ value, value_len, &t);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int object_key_increment (
|
|
static int object_key_increment (
|
|
|
hdb_handle_t object_handle,
|
|
hdb_handle_t object_handle,
|
|
|
const void *key_name,
|
|
const void *key_name,
|
|
@@ -1205,8 +1234,40 @@ static int _dump_object(struct object_instance *instance, FILE *file, int depth)
|
|
|
|
|
|
|
|
memcpy(stringbuf1, object_key->key_name, object_key->key_len);
|
|
memcpy(stringbuf1, object_key->key_name, object_key->key_len);
|
|
|
stringbuf1[object_key->key_len] = '\0';
|
|
stringbuf1[object_key->key_len] = '\0';
|
|
|
- memcpy(stringbuf2, object_key->value, object_key->value_len);
|
|
|
|
|
- stringbuf2[object_key->value_len] = '\0';
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ switch (object_key->value_type) {
|
|
|
|
|
+ case OBJDB_VALUETYPE_INT16:
|
|
|
|
|
+ snprintf (stringbuf2, sizeof(int), "%hd",
|
|
|
|
|
+ *(unsigned int*)object_key->value);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case OBJDB_VALUETYPE_UINT16:
|
|
|
|
|
+ snprintf (stringbuf2, sizeof(int), "%hu",
|
|
|
|
|
+ *(unsigned int*)object_key->value);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case OBJDB_VALUETYPE_INT32:
|
|
|
|
|
+ snprintf (stringbuf2, sizeof(int), "%d",
|
|
|
|
|
+ *(int*)object_key->value);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case OBJDB_VALUETYPE_UINT32:
|
|
|
|
|
+ snprintf (stringbuf2, sizeof(int), "%u",
|
|
|
|
|
+ *(unsigned int*)object_key->value);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case OBJDB_VALUETYPE_INT64:
|
|
|
|
|
+ snprintf (stringbuf2, sizeof(int), "%ld",
|
|
|
|
|
+ *(long int*)object_key->value);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case OBJDB_VALUETYPE_UINT64:
|
|
|
|
|
+ snprintf (stringbuf2, sizeof(int), "%lu",
|
|
|
|
|
+ *(unsigned long int*)object_key->value);
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ case OBJDB_VALUETYPE_STRING:
|
|
|
|
|
+ case OBJDB_VALUETYPE_ANY:
|
|
|
|
|
+ memcpy(stringbuf2, object_key->value, object_key->value_len);
|
|
|
|
|
+ stringbuf2[object_key->value_len] = '\0';
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
for (i=0; i<depth+1; i++)
|
|
for (i=0; i<depth+1; i++)
|
|
|
fprintf(file, " ");
|
|
fprintf(file, " ");
|
|
@@ -1255,12 +1316,11 @@ error_exit:
|
|
|
return (-1);
|
|
return (-1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-static int object_key_iter(hdb_handle_t parent_object_handle,
|
|
|
|
|
- void **key_name,
|
|
|
|
|
- size_t *key_len,
|
|
|
|
|
|
|
+static int object_key_iter_typed (hdb_handle_t parent_object_handle,
|
|
|
|
|
+ char **key_name,
|
|
|
void **value,
|
|
void **value,
|
|
|
- size_t *value_len)
|
|
|
|
|
|
|
+ size_t *value_len,
|
|
|
|
|
+ objdb_value_types_t *type)
|
|
|
{
|
|
{
|
|
|
unsigned int res;
|
|
unsigned int res;
|
|
|
struct object_instance *instance;
|
|
struct object_instance *instance;
|
|
@@ -1284,9 +1344,8 @@ static int object_key_iter(hdb_handle_t parent_object_handle,
|
|
|
instance->iter_key_list = list;
|
|
instance->iter_key_list = list;
|
|
|
if (found) {
|
|
if (found) {
|
|
|
*key_name = find_key->key_name;
|
|
*key_name = find_key->key_name;
|
|
|
- if (key_len)
|
|
|
|
|
- *key_len = find_key->key_len;
|
|
|
|
|
*value = find_key->value;
|
|
*value = find_key->value;
|
|
|
|
|
+ *type = find_key->value_type;
|
|
|
if (value_len)
|
|
if (value_len)
|
|
|
*value_len = find_key->value_len;
|
|
*value_len = find_key->value_len;
|
|
|
res = 0;
|
|
res = 0;
|
|
@@ -1304,6 +1363,21 @@ error_exit:
|
|
|
return (-1);
|
|
return (-1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int object_key_iter(hdb_handle_t parent_object_handle,
|
|
|
|
|
+ void **key_name,
|
|
|
|
|
+ size_t *key_len,
|
|
|
|
|
+ void **value,
|
|
|
|
|
+ size_t *value_len)
|
|
|
|
|
+{
|
|
|
|
|
+ objdb_value_types_t t;
|
|
|
|
|
+ int ret;
|
|
|
|
|
+ char *str;
|
|
|
|
|
+ ret = object_key_iter_typed (parent_object_handle, (char**)key_name, value, value_len, &t);
|
|
|
|
|
+ str = *key_name;
|
|
|
|
|
+ *key_len = strlen(str);
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int object_key_iter_from(hdb_handle_t parent_object_handle,
|
|
static int object_key_iter_from(hdb_handle_t parent_object_handle,
|
|
|
hdb_handle_t start_pos,
|
|
hdb_handle_t start_pos,
|
|
|
void **key_name,
|
|
void **key_name,
|
|
@@ -1599,6 +1673,9 @@ struct objdb_iface_ver0 objdb_iface = {
|
|
|
.object_reload_config = object_reload_config,
|
|
.object_reload_config = object_reload_config,
|
|
|
.object_key_increment = object_key_increment,
|
|
.object_key_increment = object_key_increment,
|
|
|
.object_key_decrement = object_key_decrement,
|
|
.object_key_decrement = object_key_decrement,
|
|
|
|
|
+ .object_key_create_typed = object_key_create_typed,
|
|
|
|
|
+ .object_key_get_typed = object_key_get_typed,
|
|
|
|
|
+ .object_key_iter_typed = object_key_iter_typed,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
struct lcr_iface objdb_iface_ver0[1] = {
|
|
struct lcr_iface objdb_iface_ver0[1] = {
|