Explorar o código

Merge trunk revision 2512:
r2512 | asalkeld | 2009-10-11 15:53:13 -0700 (Sun, 11 Oct 2009) | 4 lines

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/branches/flatiron@2586 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake %!s(int64=16) %!d(string=hai) anos
pai
achega
d26ee7a3a1
Modificáronse 1 ficheiros con 79 adicións e 6 borrados
  1. 79 6
      exec/objdb.c

+ 79 - 6
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;