diff --git a/include/neu_data_expr.h b/include/neu_data_expr.h index 34f2ab6d..947329e3 100644 --- a/include/neu_data_expr.h +++ b/include/neu_data_expr.h @@ -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 */ diff --git a/plugins/sample/plugin_sample_app.c b/plugins/sample/plugin_sample_app.c index cf997685..964b95d6 100644 --- a/plugins/sample/plugin_sample_app.c +++ b/plugins/sample/plugin_sample_app.c @@ -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); } diff --git a/plugins/sample/plugin_sample_drv.c b/plugins/sample/plugin_sample_drv.c index b27def30..bf7810aa 100644 --- a/plugins/sample/plugin_sample_drv.c +++ b/plugins/sample/plugin_sample_drv.c @@ -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); } diff --git a/src/base/neu_data_expr.c b/src/base/neu_data_expr.c index 798cef97..489b3b29 100644 --- a/src/base/neu_data_expr.c +++ b/src/base/neu_data_expr.c @@ -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; diff --git a/src/parser/neu_json_plugin.h b/src/parser/neu_json_plugin.h index 1c0db194..625df377 100644 --- a/src/parser/neu_json_plugin.h +++ b/src/parser/neu_json_plugin.h @@ -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 \ No newline at end of file +#endif diff --git a/src/types.c b/src/types.c index 6894ac1e..c9e4fa0a 100644 --- a/src/types.c +++ b/src/types.c @@ -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; -} \ No newline at end of file +} diff --git a/tests/data_val_test.cc b/tests/data_val_test.cc index f25e7f8a..1dea8260 100644 --- a/tests/data_val_test.cc +++ b/tests/data_val_test.cc @@ -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);