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;