From 0c9a6c49ffb291d651750214ee6f2dceb114ae21 Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Sun, 11 Oct 2009 22:53:13 +0000 Subject: [PATCH] teach object_key_increment() key types. This is so we can increment all integer types correctly. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2512 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/objdb.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/exec/objdb.c b/exec/objdb.c index 0e4d6e9d..726b302a 100644 --- a/exec/objdb.c +++ b/exec/objdb.c @@ -968,9 +968,45 @@ static int object_key_increment ( break; } } - if (found && object_key->value_len == sizeof(int)) { - (*(int *)object_key->value)++; - *value = *(int *)object_key->value; + + if (found) { + switch (object_key->value_type) { + case OBJDB_VALUETYPE_INT16: + (*(int16_t *)object_key->value)++; + break; + case OBJDB_VALUETYPE_UINT16: + (*(uint16_t *)object_key->value)++; + break; + case OBJDB_VALUETYPE_INT32: + (*(int32_t *)object_key->value)++; + break; + case OBJDB_VALUETYPE_UINT32: + (*(uint32_t *)object_key->value)++; + break; + case OBJDB_VALUETYPE_INT64: + (*(int64_t *)object_key->value)++; + break; + case OBJDB_VALUETYPE_UINT64: + (*(uint64_t *)object_key->value)++; + break; + case OBJDB_VALUETYPE_ANY: + /* for backwards compatibilty */ + if (object_key->value_len == sizeof(int)) { + (*(int *)object_key->value)++; + } + else { + res = -1; + } + break; + default: + res = -1; + break; + } + if (res == 0) { + /* nasty, not sure why we need to return this typed + * instead of void* */ + *value = *(int *)object_key->value; + } } else { res = -1; @@ -1014,9 +1050,46 @@ static int object_key_decrement ( break; } } - if (found && object_key->value_len == sizeof(int)) { - (*(int *)object_key->value)--; - *value = *(int *)object_key->value; + + + if (found) { + switch (object_key->value_type) { + case OBJDB_VALUETYPE_INT16: + (*(int16_t *)object_key->value)--; + break; + case OBJDB_VALUETYPE_UINT16: + (*(uint16_t *)object_key->value)--; + break; + case OBJDB_VALUETYPE_INT32: + (*(int32_t *)object_key->value)--; + break; + case OBJDB_VALUETYPE_UINT32: + (*(uint32_t *)object_key->value)--; + break; + case OBJDB_VALUETYPE_INT64: + (*(int64_t *)object_key->value)--; + break; + case OBJDB_VALUETYPE_UINT64: + (*(uint64_t *)object_key->value)--; + break; + case OBJDB_VALUETYPE_ANY: + /* for backwards compatibilty */ + if (object_key->value_len == sizeof(int)) { + (*(int *)object_key->value)--; + } + else { + res = -1; + } + break; + default: + res = -1; + break; + } + if (res == 0) { + /* nasty, not sure why we need to return this typed + * instead of void* */ + *value = *(int *)object_key->value; + } } else { res = -1;