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.



git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1783 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
Christine Caulfield 2009-02-26 14:49:41 +00:00
parent 58ab8d4a65
commit d604803280
5 changed files with 37 additions and 43 deletions

View File

@ -497,9 +497,9 @@ static int object_key_create (
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 @@ static int object_key_create (
}
}
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);
}
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);
}
memcpy (&val, value, 4);
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 @@ error_exit:
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 @@ static int object_key_delete (
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 @@ static int object_key_delete (
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 @@ static int object_key_replace (
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 @@ static int object_key_replace (
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;
}

View File

@ -277,17 +277,13 @@ struct corosync_api_v1 {
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);

View File

@ -152,17 +152,13 @@ struct objdb_iface_ver0 {
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);

View File

@ -227,8 +227,7 @@ int confdb_sa_key_delete (
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 @@ int confdb_sa_key_replace (
{
return objdb->object_key_replace(parent_object_handle,
key_name, key_name_len,
old_value, old_value_len,
new_value, new_value_len);
}

View File

@ -430,8 +430,6 @@ static void message_handler_req_lib_confdb_key_replace (void *conn, void *messag
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 @@ static void message_handler_req_lib_confdb_key_delete (void *conn, void *message
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);