The current object database allows duplicate key names per object. This
is a bit of a nightmare to manage and provides no useful functionality
that I can see. Making keys unique has been discussed on IRC several
times and there seem to be no objections...so here is the patch:
Note that I have removed some now-useless parameters from the objdb API
too.
Chrissie
Index: services/confdb.c
===================================================================
--- services/confdb.c (revision 1782)
+++ services/confdb.c (working copy)
@@ -430,8 +430,6 @@
if (api->object_key_replace(req_lib_confdb_key_replace->object_handle,
req_lib_confdb_key_replace->key_name.value,
req_lib_confdb_key_replace->key_name.length,
- req_lib_confdb_key_replace->old_value.value,
- req_lib_confdb_key_replace->old_value.length,
req_lib_confdb_key_replace->new_value.value,
req_lib_confdb_key_replace->new_value.length))
ret = CS_ERR_ACCESS;
@@ -450,9 +448,7 @@
if (api->object_key_delete(req_lib_confdb_key_delete->object_handle,
req_lib_confdb_key_delete->key_name.value,
- req_lib_confdb_key_delete->key_name.length,
- req_lib_confdb_key_delete->value.value,
- req_lib_confdb_key_delete->value.length))
+ req_lib_confdb_key_delete->key_name.length))
ret = CS_ERR_ACCESS;
res.size = sizeof(res);
Index: include/corosync/engine/coroapi.h
===================================================================
--- include/corosync/engine/coroapi.h (revision 1782)
+++ include/corosync/engine/coroapi.h (working copy)
@@ -277,17 +277,13 @@
hdb_handle_t object_handle,
void *key_name,
int key_len,
- void *old_value,
- int old_value_len,
void *new_value,
int new_value_len);
int (*object_key_delete) (
hdb_handle_t object_handle,
void *key_name,
- int key_len,
- void *value,
- int value_len);
+ int key_len);
int (*object_iter_reset) (
hdb_handle_t parent_object_handle);
Index: include/corosync/engine/objdb.h
===================================================================
--- include/corosync/engine/objdb.h (revision 1782)
+++ include/corosync/engine/objdb.h (working copy)
@@ -152,17 +152,13 @@
hdb_handle_t object_handle,
void *key_name,
int key_len,
- void *old_value,
- int old_value_len,
void *new_value,
int new_value_len);
int (*object_key_delete) (
hdb_handle_t object_handle,
void *key_name,
- int key_len,
- void *value,
- int value_len);
+ int key_len);
int (*object_iter_reset) (
hdb_handle_t parent_object_handle);
Index: exec/objdb.c
===================================================================
--- exec/objdb.c (revision 1782)
+++ exec/objdb.c (working copy)
@@ -497,9 +497,9 @@
struct object_instance *instance;
struct object_key *object_key;
unsigned int res;
+ struct list_head *list;
int found = 0;
int i;
- unsigned int val;
objdb_rdlock();
@@ -541,27 +541,45 @@
}
}
- object_key = malloc (sizeof (struct object_key));
- if (object_key == 0) {
- goto error_put;
+ /* See if it already exists */
+ found = 0;
+ for (list = instance->key_head.next;
+ list != &instance->key_head; list = list->next) {
+
+ object_key = list_entry (list, struct object_key, list);
+
+ if ((object_key->key_len == key_len) &&
+ (memcmp (object_key->key_name, key_name, key_len) == 0)) {
+ found = 1;
+ break;
+ }
}
- object_key->key_name = malloc (key_len);
- if (object_key->key_name == 0) {
- goto error_put_object;
+
+ if (found) {
+ free(object_key->value);
}
- memcpy (&val, value, 4);
+ else {
+ object_key = malloc (sizeof (struct object_key));
+ if (object_key == 0) {
+ goto error_put;
+ }
+ object_key->key_name = malloc (key_len);
+ if (object_key->key_name == 0) {
+ goto error_put_object;
+ }
+ memcpy (object_key->key_name, key_name, key_len);
+ list_init (&object_key->list);
+ list_add_tail (&object_key->list, &instance->key_head);
+ }
object_key->value = malloc (value_len);
if (object_key->value == 0) {
goto error_put_key;
}
- memcpy (object_key->key_name, key_name, key_len);
memcpy (object_key->value, value, value_len);
object_key->key_len = key_len;
object_key->value_len = value_len;
- list_init (&object_key->list);
- list_add_tail (&object_key->list, &instance->key_head);
object_key_changed_notification(object_handle, key_name, key_len,
value, value_len, OBJECT_KEY_CREATED);
objdb_rdunlock();
@@ -976,9 +994,7 @@
static int object_key_delete (
hdb_handle_t object_handle,
void *key_name,
- int key_len,
- void *value,
- int value_len)
+ int key_len)
{
unsigned int res;
int ret = 0;
@@ -999,10 +1015,7 @@
object_key = list_entry (list, struct object_key, list);
if ((object_key->key_len == key_len) &&
- (memcmp (object_key->key_name, key_name, key_len) == 0) &&
- (value == NULL ||
- (object_key->value_len == value_len &&
- (memcmp (object_key->value, value, value_len) == 0)))) {
+ (memcmp (object_key->key_name, key_name, key_len) == 0)) {
found = 1;
break;
}
@@ -1021,7 +1034,7 @@
hdb_handle_put (&object_instance_database, object_handle);
if (ret == 0)
object_key_changed_notification(object_handle, key_name, key_len,
- value, value_len, OBJECT_KEY_DELETED);
+ NULL, 0, OBJECT_KEY_DELETED);
objdb_rdunlock();
return (ret);
@@ -1034,8 +1047,6 @@
hdb_handle_t object_handle,
void *key_name,
int key_len,
- void *old_value,
- int old_value_len,
void *new_value,
int new_value_len)
{
@@ -1059,10 +1070,7 @@
object_key = list_entry (list, struct object_key, list);
if ((object_key->key_len == key_len) &&
- (memcmp (object_key->key_name, key_name, key_len) == 0) &&
- (old_value == NULL ||
- (object_key->value_len == old_value_len &&
- (memcmp (object_key->value, old_value, old_value_len) == 0)))) {
+ (memcmp (object_key->key_name, key_name, key_len) == 0)) {
found = 1;
break;
}
Index: lib/sa-confdb.c
===================================================================
--- lib/sa-confdb.c (revision 1782)
+++ lib/sa-confdb.c (working copy)
@@ -227,8 +227,7 @@
int value_len)
{
return objdb->object_key_delete(parent_object_handle,
- key_name, key_name_len,
- value, value_len);
+ key_name, key_name_len);
}
int confdb_sa_key_get (
@@ -290,7 +289,6 @@
{
return objdb->object_key_replace(parent_object_handle,
key_name, key_name_len,
- old_value, old_value_len,
new_value, new_value_len);
}
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais