Improve the implementation of set/get functions in data value

This commit is contained in:
Parker Liu
2021-09-28 17:22:25 +08:00
parent e6ff008086
commit 940acfd3f6
7 changed files with 148 additions and 81 deletions
+3 -3
View File
@@ -247,11 +247,11 @@ void neu_dvalue_init_uint32(neu_data_val_t *val, uint32_t u32);
void neu_dvalue_init_uint64(neu_data_val_t *val, uint64_t u64);
void neu_dvalue_init_float(neu_data_val_t *val, float f32);
void neu_dvalue_init_double(neu_data_val_t *val, double f64);
void neu_dvalue_init_errorcode(neu_data_val_t *val, int32_t i32);
void neu_dvalue_init_int_val(neu_data_val_t *val, neu_int_val_t int_val);
void neu_dvalue_init_string_val(neu_data_val_t * val,
neu_string_val_t string_val);
void neu_dvalue_init_data_val(neu_data_val_t *val, void *data);
void neu_dvalue_init_errorcode_val(neu_data_val_t *val, int32_t i32);
/* The parameter cstr/bytes/array/vec is copy to neu_data_val_t
*/
@@ -294,9 +294,9 @@ int neu_dvalue_set_uint32(neu_data_val_t *val, uint32_t u32);
int neu_dvalue_set_uint64(neu_data_val_t *val, uint64_t u64);
int neu_dvalue_set_float(neu_data_val_t *val, float f32);
int neu_dvalue_set_double(neu_data_val_t *val, double f64);
int neu_dvalue_set_errorcode(neu_data_val_t *val, int32_t i32);
int neu_dvalue_set_int_val(neu_data_val_t *val, neu_int_val_t int_val);
int neu_dvalue_set_string_val(neu_data_val_t *val, neu_string_val_t string_val);
int neu_dvalue_set_errorcode(neu_data_val_t *val, int32_t i32);
/* The parameter cstr/bytes/array/vec is copy to neu_data_val_t
*/
@@ -338,11 +338,11 @@ int neu_dvalue_get_uint32(neu_data_val_t *val, uint32_t *p_u32);
int neu_dvalue_get_uint64(neu_data_val_t *val, uint64_t *p_u64);
int neu_dvalue_get_float(neu_data_val_t *val, float *p_f32);
int neu_dvalue_get_double(neu_data_val_t *val, double *p_f64);
int neu_dvalue_get_errorcode(neu_data_val_t *val, int32_t *p_i32);
int neu_dvalue_get_int_val(neu_data_val_t *val, neu_int_val_t *p_int_val);
int neu_dvalue_get_string_val(neu_data_val_t * val,
neu_string_val_t *p_string_val);
int neu_dvalue_get_data_val(neu_data_val_t *val, void **p_data);
int neu_dvalue_get_errorcode(neu_data_val_t *val, int32_t *p_i32);
/* The parameter cstr/bytes/array/vec is copy from neu_data_val_t
*/
+2 -2
View File
@@ -395,7 +395,7 @@ static int handle_trans_data_value(neu_data_val_t *trans_val)
int_val = neu_fixed_array_get(array, 0);
val_err = int_val->val;
neu_dvalue_get_int32(val_err, &err);
neu_dvalue_get_errorcode(val_err, &err);
int_val = neu_fixed_array_get(array, 1);
val_i64 = int_val->val;
@@ -434,7 +434,7 @@ static int handle_write_resp_value(neu_data_val_t *data_value)
for (i = 0; i < array->length; i++) {
int_val = neu_fixed_array_get(array, i);
val_err = int_val->val;
neu_dvalue_get_int32(val_err, &err);
neu_dvalue_get_errorcode(val_err, &err);
log_info("The sample driver write datatag(%d) return result(%d)",
int_val->key, err);
}
+3 -3
View File
@@ -122,8 +122,8 @@ static neu_data_val_t *setup_read_resp_data_value()
neu_int_val_t int_val;
neu_data_val_t *val_err;
val_err = neu_dvalue_new(NEU_DTYPE_INT32);
neu_dvalue_set_int32(val_err, 0);
val_err = neu_dvalue_new(NEU_DTYPE_ERRORCODE);
neu_dvalue_set_errorcode(val_err, 0);
// tag id of first element is 0 for indicate all reading
neu_int_val_init(&int_val, 0, val_err);
neu_fixed_array_set(array, 0, (void *) &int_val);
@@ -202,7 +202,7 @@ static int handle_write_data_value(neu_data_val_t * write_val,
val_i32 = neu_dvalue_unit_new();
// all results of writing is success, so set 0
neu_dvalue_init_int32(val_i32, 0);
neu_dvalue_init_errorcode(val_i32, 0);
neu_int_val_init(&resp_int_val, i, val_i32);
neu_fixed_array_set(array, i, &resp_int_val);
}
+133 -69
View File
@@ -62,6 +62,7 @@ static bool type_has_pointer(neu_dtype_e type)
case NEU_DTYPE_BYTES:
case NEU_DTYPE_TEXT:
case NEU_DTYPE_STRUCT:
case NEU_DTYPE_DATA_VAL:
return true;
default:
@@ -327,6 +328,12 @@ void neu_dvalue_init_double(neu_data_val_t *val, double f64)
val->val_double = f64;
}
void neu_dvalue_init_errorcode(neu_data_val_t *val, int32_t i32)
{
val->type = NEU_DTYPE_ERRORCODE;
val->val_int32 = i32;
}
void neu_dvalue_init_int_val(neu_data_val_t *val, neu_int_val_t int_val)
{
neu_dtype_e type;
@@ -356,18 +363,6 @@ void neu_dvalue_init_string_val(neu_data_val_t * val,
}
}
void neu_dvalue_init_data_val(neu_data_val_t *val, void *data)
{
val->type = NEU_DTYPE_DATA_VAL;
val->val_data = data;
}
void neu_dvalue_init_errorcode_val(neu_data_val_t *val, int32_t i32)
{
val->type = NEU_DTYPE_ERRORCODE;
val->val_int32 = i32;
}
void neu_dvalue_init_copy_cstr(neu_data_val_t *val, char *cstr)
{
val->type = NEU_DTYPE_CSTR | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
@@ -483,6 +478,17 @@ void neu_dvalue_init_move_bytes(neu_data_val_t *val, neu_bytes_t *bytes)
val->val_data = bytes;
}
void neu_dvalue_init_move_data_val(neu_data_val_t *val, neu_data_val_t *data)
{
neu_dtype_e type;
type = NEU_DTYPE_DATA_VAL;
type |= NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
val->type = type;
val->val_data = data;
}
/* The owership of parameter array is move to neu_data_val_t
*/
void neu_dvalue_init_move_array(neu_data_val_t *val, neu_dtype_e type,
@@ -642,6 +648,17 @@ int neu_dvalue_set_double(neu_data_val_t *val, double f64)
}
}
int neu_dvalue_set_errorcode(neu_data_val_t *val, int32_t i32)
{
assert(val->type == NEU_DTYPE_ERRORCODE);
if (val->type == NEU_DTYPE_ERRORCODE) {
val->val_int32 = i32;
return 0;
} else {
return -1;
}
}
int neu_dvalue_set_int_val(neu_data_val_t *val, neu_int_val_t int_val)
{
neu_dtype_e type;
@@ -691,29 +708,21 @@ int neu_dvalue_set_string_val(neu_data_val_t *val, neu_string_val_t string_val)
}
}
int neu_dvalue_set_errorcode(neu_data_val_t *val, int32_t i32)
{
assert(val->type == NEU_DTYPE_ERRORCODE);
if (val->type == NEU_DTYPE_ERRORCODE) {
val->val_int32 = i32;
return 0;
} else {
return -1;
}
}
int neu_dvalue_set_cstr(neu_data_val_t *val, char *cstr)
{
neu_dtype_e type;
neu_dtype_e val_type;
type = NEU_DTYPE_CSTR | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL) {
val_type = val->type | NEU_DTYPE_OWNERED_PTR;
assert(val_type == type);
if (val_type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
free(val->val_data);
}
val->val_data = strdup(cstr);
val->type = type;
return 0;
} else {
return -1;
@@ -723,15 +732,18 @@ int neu_dvalue_set_cstr(neu_data_val_t *val, char *cstr)
int neu_dvalue_set_string(neu_data_val_t *val, neu_string_t *string)
{
neu_dtype_e type;
neu_dtype_e val_type;
type = NEU_DTYPE_BYTES | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type = NEU_DTYPE_STRING | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL) {
val_type = val->type | NEU_DTYPE_OWNERED_PTR;
assert(val_type == type);
if (val_type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_string_free(val->val_data);
}
val->val_data = neu_string_clone(string);
val->type = type;
return 0;
} else {
return -1;
@@ -741,15 +753,18 @@ int neu_dvalue_set_string(neu_data_val_t *val, neu_string_t *string)
int neu_dvalue_set_bytes(neu_data_val_t *val, neu_bytes_t *bytes)
{
neu_dtype_e type;
neu_dtype_e val_type;
type = NEU_DTYPE_BYTES | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL) {
val_type = val->type | NEU_DTYPE_OWNERED_PTR;
assert(val_type == type);
if (val_type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_bytes_free(val->val_data);
}
val->val_data = neu_bytes_clone(bytes);
val->type = type;
return 0;
} else {
return -1;
@@ -759,15 +774,18 @@ int neu_dvalue_set_bytes(neu_data_val_t *val, neu_bytes_t *bytes)
int neu_dvalue_set_array(neu_data_val_t *val, neu_fixed_array_t *array)
{
neu_dtype_e type;
neu_dtype_e flags_type;
type = NEU_DTYPE_ARRAY | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
assert(neu_flags_type_in_dtype(val->type) == type);
if (neu_flags_type_in_dtype(val->type) == type) {
if (val->val_data != NULL) {
flags_type = neu_flags_type_in_dtype(val->type);
assert((flags_type | NEU_DTYPE_OWNERED_PTR) == type);
if ((flags_type | NEU_DTYPE_OWNERED_PTR) == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_fixed_array_free(val->val_data);
}
val->val_data = neu_fixed_array_clone(array);
val->type |= NEU_DTYPE_OWNERED_PTR;
return 0;
} else {
log_error("value type: 0x%08x not match expect type: 0x%08x", val->type,
@@ -779,15 +797,18 @@ int neu_dvalue_set_array(neu_data_val_t *val, neu_fixed_array_t *array)
int neu_dvalue_set_vec(neu_data_val_t *val, vector_t *vec)
{
neu_dtype_e type;
neu_dtype_e flags_type;
type = NEU_DTYPE_VEC | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
assert(neu_flags_type_in_dtype(val->type) == type);
if (neu_flags_type_in_dtype(val->type) == type) {
if (val->val_data != NULL) {
flags_type = neu_flags_type_in_dtype(val->type);
assert((flags_type | NEU_DTYPE_OWNERED_PTR) == type);
if ((flags_type | NEU_DTYPE_OWNERED_PTR) == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
vector_free(val->val_data);
}
val->val_data = vector_clone(vec);
val->type |= NEU_DTYPE_OWNERED_PTR;
return 0;
} else {
log_error("value type: 0x%08x not match expect type: 0x%08x", val->type,
@@ -806,7 +827,7 @@ int neu_dvalue_set_ref_cstr(neu_data_val_t *val, char *cstr)
val_type = val->type & ~NEU_DTYPE_OWNERED_PTR;
assert(val_type == type);
if (val_type == type) {
if (val->type & NEU_DTYPE_OWNERED_PTR) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
free(val->val_data);
}
val->val_data = cstr;
@@ -827,7 +848,7 @@ int neu_dvalue_set_ref_string(neu_data_val_t *val, neu_string_t *string)
val_type = val->type & ~NEU_DTYPE_OWNERED_PTR;
assert(val_type == type);
if (val_type == type) {
if (val->type & NEU_DTYPE_OWNERED_PTR) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_string_free(val->val_data);
}
val->val_data = string;
@@ -848,7 +869,7 @@ int neu_dvalue_set_ref_bytes(neu_data_val_t *val, neu_bytes_t *bytes)
val_type = val->type & ~NEU_DTYPE_OWNERED_PTR;
assert(val_type == type);
if (val_type == type) {
if (val->type & NEU_DTYPE_OWNERED_PTR) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_bytes_free(val->val_data);
}
val->val_data = bytes;
@@ -869,11 +890,11 @@ int neu_dvalue_set_ref_array(neu_data_val_t *val, neu_fixed_array_t *array)
flags_type = neu_flags_type_in_dtype(val->type);
assert((flags_type & ~NEU_DTYPE_OWNERED_PTR) == type);
if ((flags_type & ~NEU_DTYPE_OWNERED_PTR) == type) {
if (val->type & NEU_DTYPE_OWNERED_PTR) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_fixed_array_free(val->val_data);
}
val->val_data = array;
val->type = neu_value_type_in_dtype(val->type) | type;
val->type = type;
return 0;
} else {
return -1;
@@ -890,11 +911,11 @@ int neu_dvalue_set_ref_vec(neu_data_val_t *val, vector_t *vec)
flags_type = neu_flags_type_in_dtype(val->type);
assert((flags_type & ~NEU_DTYPE_OWNERED_PTR) == type);
if ((flags_type & ~NEU_DTYPE_OWNERED_PTR) == type) {
if (val->type & NEU_DTYPE_OWNERED_PTR) {
neu_fixed_array_free(val->val_data);
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
vector_free(val->val_data);
}
val->val_data = vec;
val->type = neu_value_type_in_dtype(val->type) | type;
val->type = type;
return 0;
} else {
return -1;
@@ -945,6 +966,9 @@ int neu_dvalue_set_move_cstr(neu_data_val_t *val, char *cstr)
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
free(val->val_data);
}
val->val_data = cstr;
return 0;
} else {
@@ -960,6 +984,9 @@ int neu_dvalue_set_move_string(neu_data_val_t *val, neu_string_t *string)
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_string_free(val->val_data);
}
val->val_data = string;
return 0;
} else {
@@ -975,6 +1002,9 @@ int neu_dvalue_set_move_bytes(neu_data_val_t *val, neu_bytes_t *bytes)
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_bytes_free(val->val_data);
}
val->val_data = bytes;
return 0;
} else {
@@ -982,6 +1012,24 @@ int neu_dvalue_set_move_bytes(neu_data_val_t *val, neu_bytes_t *bytes)
}
}
int neu_dvalue_set_move_data_val(neu_data_val_t *val, neu_data_val_t *data)
{
neu_dtype_e type;
type = NEU_DTYPE_DATA_VAL | NEU_DTYPE_PTR | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
assert(val->type == type);
if (val->type == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_dvalue_free(val->val_data);
}
val->val_data = data;
return 0;
} else {
return -1;
}
}
int neu_dvalue_set_move_array(neu_data_val_t *val, neu_fixed_array_t *array)
{
neu_dtype_e type;
@@ -990,6 +1038,9 @@ int neu_dvalue_set_move_array(neu_data_val_t *val, neu_fixed_array_t *array)
type |= NEU_DTYPE_OWNERED_PTR;
assert(neu_flags_type_in_dtype(val->type) == type);
if (neu_flags_type_in_dtype(val->type) == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
neu_fixed_array_free(val->val_data);
}
val->val_data = array;
return 0;
} else {
@@ -1005,6 +1056,9 @@ int neu_dvalue_set_move_vec(neu_data_val_t *val, vector_t *vec)
type |= NEU_DTYPE_OWNERED_PTR;
assert(neu_flags_type_in_dtype(val->type) == type);
if (neu_flags_type_in_dtype(val->type) == type) {
if (val->val_data != NULL && (val->type & NEU_DTYPE_OWNERED_PTR)) {
vector_free(val->val_data);
}
val->val_data = vec;
return 0;
} else {
@@ -1147,6 +1201,17 @@ int neu_dvalue_get_double(neu_data_val_t *val, double *p_f64)
}
}
int neu_dvalue_get_errorcode(neu_data_val_t *val, int32_t *p_i32)
{
assert(val->type == NEU_DTYPE_ERRORCODE);
if (val->type == NEU_DTYPE_ERRORCODE) {
*p_i32 = val->val_int32;
return 0;
} else {
return -1;
}
}
int neu_dvalue_get_int_val(neu_data_val_t *val, neu_int_val_t *p_int_val)
{
neu_dtype_e val_type;
@@ -1184,28 +1249,6 @@ int neu_dvalue_get_string_val(neu_data_val_t * val,
}
}
int neu_dvalue_get_data_val(neu_data_val_t *val, void **p_data)
{
assert(val->type == NEU_DTYPE_DATA_VAL);
if (val->type == NEU_DTYPE_DATA_VAL) {
*p_data = val->val_data;
return 0;
} else {
return -1;
}
}
int neu_dvalue_get_errorcode(neu_data_val_t *val, int32_t *p_i32)
{
assert(val->type == NEU_DTYPE_ERRORCODE);
if (val->type == NEU_DTYPE_ERRORCODE) {
*p_i32 = val->val_int32;
return 0;
} else {
return -1;
}
}
int neu_dvalue_get_cstr(neu_data_val_t *val, char **p_cstr)
{
neu_dtype_e val_type;
@@ -1470,6 +1513,27 @@ int neu_dvalue_get_move_bytes(neu_data_val_t *val, neu_bytes_t **p_bytes)
}
}
int neu_dvalue_get_move_data_val(neu_data_val_t *val, neu_data_val_t **p_data)
{
neu_dtype_e val_type;
neu_dtype_e type;
type = NEU_DTYPE_DATA_VAL | NEU_DTYPE_EXTERN_PTR;
type |= NEU_DTYPE_OWNERED_PTR;
val_type = val->type & (~NEU_DTYPE_PTR_MASK);
assert(val_type == type);
if (val->type == type) {
*p_data = (neu_data_val_t *) val->val_data;
val->val_data = NULL;
val->type &= ~NEU_DTYPE_OWNERED_PTR;
return 0;
} else {
*p_data = NULL;
return -1;
}
}
int neu_dvalue_get_move_array(neu_data_val_t *val, neu_fixed_array_t **p_array)
{
neu_dtype_e val_type;
+2 -1
View File
@@ -57,6 +57,7 @@ int neu_parse_decode_update_plugin(char * buf,
void neu_parse_decode_update_plugin_free(neu_parse_update_plugin_req_t *req);
typedef struct {
uint32_t reserved;
} neu_parse_get_plugins_req_t;
typedef struct {
@@ -81,4 +82,4 @@ int neu_parse_encode_get_plugins(void *json_object, void *param);
}
#endif
#endif
#endif
+4 -2
View File
@@ -908,7 +908,9 @@ neu_fixed_array_t *neu_fixed_array_new(size_t length, size_t esize)
/* shallow free */
void neu_fixed_array_free(neu_fixed_array_t *array)
{
free(array);
if (array != NULL) {
free(array);
}
return;
}
@@ -956,4 +958,4 @@ int string_is_number(char *s)
}
return 0;
}
}
+1 -1
View File
@@ -145,7 +145,7 @@ TEST(DataValueTest, neu_dvalue_init_set_get_prim_val)
/** test errorcode **/
int32_t ret_error = 0;
val = neu_dvalue_new(NEU_DTYPE_ERRORCODE);
neu_dvalue_init_errorcode_val(val, -1);
neu_dvalue_init_errorcode(val, -1);
EXPECT_EQ(0, neu_dvalue_get_errorcode(val, &ret_error));
EXPECT_EQ(NEU_DTYPE_ERRORCODE, neu_dvalue_get_type(val));
EXPECT_EQ(-1, ret_error);