mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2026-01-26 04:33:59 +00:00
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:
parent
58ab8d4a65
commit
d604803280
58
exec/objdb.c
58
exec/objdb.c
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user