From 42a6a10fab64e7e3b9d5781bc9a729720817e19b Mon Sep 17 00:00:00 2001 From: fengzero Date: Thu, 11 Jun 2026 02:26:55 +0000 Subject: [PATCH] add api: check name dup before add tag --- plugins/restful/datatag_handle.c | 111 +++++++++++++++------------ src/adapter/adapter.c | 51 +++++++++--- src/adapter/driver/driver.c | 21 +++++ src/adapter/driver/driver_internal.h | 3 + src/base/group.c | 14 ++++ src/base/group.h | 1 + 6 files changed, 142 insertions(+), 59 deletions(-) diff --git a/plugins/restful/datatag_handle.c b/plugins/restful/datatag_handle.c index 03c2e68c..b51bf56b 100644 --- a/plugins/restful/datatag_handle.c +++ b/plugins/restful/datatag_handle.c @@ -47,67 +47,80 @@ void handle_add_tags(nng_aio *aio) neu_resp_add_tag_t add_resp = { 0 }; for (int i = 0; i < req->n_tag; i++) { - if (req->tags[i].type == NEU_TYPE_STRING || - req->tags[i].type == NEU_TYPE_BOOL || - req->tags[i].type == NEU_TYPE_BIT || - req->tags[i].type == NEU_TYPE_TIME || - req->tags[i].type == NEU_TYPE_DATA_AND_TIME || - req->tags[i].type == NEU_TYPE_CUSTOM) { - if (req->tags[i].precision > 0) { + for (int k = 0; k < i; k++) { + if (strcmp(req->tags[i].name, req->tags[k].name) == 0) { add_resp.index = i; - add_resp.error = NEU_ERR_TAG_PRECISION_INVALID; - break; - } - if (req->tags[i].decimal > 0) { - add_resp.index = i; - add_resp.error = NEU_ERR_TAG_DECIMAL_INVALID; - break; - } - if (req->tags[i].bias > 0) { - add_resp.index = i; - add_resp.error = NEU_ERR_TAG_BIAS_INVALID; + add_resp.error = NEU_ERR_TAG_NAME_CONFLICT; break; } } } - if (add_resp.error > 0) { handle_add_tags_resp(aio, &add_resp); } else { - header.ctx = aio; - header.type = NEU_REQ_ADD_TAG; - strncpy(cmd.driver, req->node, NEU_NODE_NAME_LEN - 1); - strncpy(cmd.group, req->group, NEU_GROUP_NAME_LEN - 1); - cmd.n_tag = req->n_tag; - cmd.tags = calloc(req->n_tag, sizeof(neu_datatag_t)); - for (int i = 0; i < req->n_tag; i++) { - cmd.tags[i].attribute = req->tags[i].attribute; - cmd.tags[i].type = req->tags[i].type; - cmd.tags[i].precision = req->tags[i].precision; - cmd.tags[i].decimal = req->tags[i].decimal; - cmd.tags[i].bias = req->tags[i].bias; - cmd.tags[i].address = strdup(req->tags[i].address); - cmd.tags[i].name = strdup(req->tags[i].name); - if (req->tags[i].description != NULL) { - cmd.tags[i].description = - strdup(req->tags[i].description); - } else { - cmd.tags[i].description = strdup(""); - } - if (req->tags[i].unit == NULL) { - cmd.tags[i].unit = strdup(""); - } else { - cmd.tags[i].unit = strdup(req->tags[i].unit); + if (req->tags[i].type == NEU_TYPE_STRING || + req->tags[i].type == NEU_TYPE_BOOL || + req->tags[i].type == NEU_TYPE_BIT || + req->tags[i].type == NEU_TYPE_TIME || + req->tags[i].type == NEU_TYPE_DATA_AND_TIME || + req->tags[i].type == NEU_TYPE_CUSTOM) { + if (req->tags[i].precision > 0) { + add_resp.index = i; + add_resp.error = NEU_ERR_TAG_PRECISION_INVALID; + break; + } + if (req->tags[i].decimal > 0) { + add_resp.index = i; + add_resp.error = NEU_ERR_TAG_DECIMAL_INVALID; + break; + } + if (req->tags[i].bias > 0) { + add_resp.index = i; + add_resp.error = NEU_ERR_TAG_BIAS_INVALID; + break; + } } } - int ret = neu_plugin_op(plugin, header, &cmd); - if (ret != 0) { - NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, { - neu_http_response(aio, NEU_ERR_IS_BUSY, - result_error); - }); + if (add_resp.error > 0) { + handle_add_tags_resp(aio, &add_resp); + } else { + header.ctx = aio; + header.type = NEU_REQ_ADD_TAG; + strncpy(cmd.driver, req->node, NEU_NODE_NAME_LEN - 1); + strncpy(cmd.group, req->group, NEU_GROUP_NAME_LEN - 1); + cmd.n_tag = req->n_tag; + cmd.tags = calloc(req->n_tag, sizeof(neu_datatag_t)); + + for (int i = 0; i < req->n_tag; i++) { + cmd.tags[i].attribute = req->tags[i].attribute; + cmd.tags[i].type = req->tags[i].type; + cmd.tags[i].precision = req->tags[i].precision; + cmd.tags[i].decimal = req->tags[i].decimal; + cmd.tags[i].bias = req->tags[i].bias; + cmd.tags[i].address = strdup(req->tags[i].address); + cmd.tags[i].name = strdup(req->tags[i].name); + if (req->tags[i].description != NULL) { + cmd.tags[i].description = + strdup(req->tags[i].description); + } else { + cmd.tags[i].description = strdup(""); + } + if (req->tags[i].unit == NULL) { + cmd.tags[i].unit = strdup(""); + } else { + cmd.tags[i].unit = strdup(req->tags[i].unit); + } + } + + int ret = neu_plugin_op(plugin, header, &cmd); + if (ret != 0) { + NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, { + neu_http_response(aio, NEU_ERR_IS_BUSY, + result_error); + }); + } } } } diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index d257037c..3c0bd776 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -1581,30 +1581,61 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) resp.index += 1; } else { resp.error = ret; - break; } } } else { resp.error = NEU_ERR_GROUP_NOT_ALLOW; } - if (resp.index > 0) { - int ret = neu_adapter_driver_try_add_tag( - (neu_adapter_driver_t *) adapter, cmd->group, cmd->tags, - resp.index); - if (ret != 0) { - resp.index = 0; - resp.error = ret; + if (resp.error != 0) { + for (uint16_t i = 0; i < cmd->n_tag; i++) { + neu_tag_fini(&cmd->tags[i]); } + neu_msg_exchange(header); + header->type = NEU_RESP_ADD_TAG; + reply(adapter, header, &resp); + free(cmd->tags); + break; } - for (int i = 0; i < resp.index; i++) { + resp.error = + neu_adapter_driver_check_tags((neu_adapter_driver_t *) adapter, + cmd->group, cmd->tags, cmd->n_tag); + if (resp.error != 0) { + for (uint16_t i = 0; i < cmd->n_tag; i++) { + neu_tag_fini(&cmd->tags[i]); + } + neu_msg_exchange(header); + resp.index = resp.error - 1; + resp.error = NEU_ERR_TAG_NAME_CONFLICT; + header->type = NEU_RESP_ADD_TAG; + reply(adapter, header, &resp); + free(cmd->tags); + break; + } + + resp.error = + neu_adapter_driver_try_add_tag((neu_adapter_driver_t *) adapter, + cmd->group, cmd->tags, cmd->n_tag); + if (resp.error != 0) { + for (uint16_t i = 0; i < cmd->n_tag; i++) { + neu_tag_fini(&cmd->tags[i]); + } + resp.index = 0; + neu_msg_exchange(header); + header->type = NEU_RESP_ADD_TAG; + reply(adapter, header, &resp); + free(cmd->tags); + break; + } + + for (int i = 0; i < cmd->n_tag; i++) { int ret = neu_adapter_driver_add_tag( (neu_adapter_driver_t *) adapter, cmd->group, &cmd->tags[i], NEU_DEFAULT_GROUP_INTERVAL); if (ret != 0) { neu_adapter_driver_try_del_tag((neu_adapter_driver_t *) adapter, - resp.index - i); + cmd->n_tag - i); resp.index = i; resp.error = ret; break; diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index 07016a11..77febb6a 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -2232,6 +2232,27 @@ int neu_adapter_driver_validate_tag(neu_adapter_driver_t *driver, return NEU_ERR_SUCCESS; } +int neu_adapter_driver_check_tags(neu_adapter_driver_t *driver, + const char *group, neu_datatag_t *tags, + int n_tag) +{ + int ret = NEU_ERR_SUCCESS; + group_t *find = NULL; + HASH_FIND_STR(driver->groups, group, find); + if (find == NULL) { + return ret; + } + + for (int i = 0; i < n_tag; i++) { + ret = neu_group_check_name(find->group, tags[i].name); + if (ret != NEU_ERR_SUCCESS) { + return i + 1; + } + } + + return ret; +} + int neu_adapter_driver_add_tag(neu_adapter_driver_t *driver, const char *group, neu_datatag_t *tag, uint16_t interval) { diff --git a/src/adapter/driver/driver_internal.h b/src/adapter/driver/driver_internal.h index 21cb1abd..3ea31e2d 100644 --- a/src/adapter/driver/driver_internal.h +++ b/src/adapter/driver/driver_internal.h @@ -72,6 +72,9 @@ int neu_adapter_driver_load_tag(neu_adapter_driver_t *driver, const char *group, int neu_adapter_driver_validate_tag(neu_adapter_driver_t *driver, const char *group, neu_datatag_t *tag); +int neu_adapter_driver_check_tags(neu_adapter_driver_t *driver, + const char *group, neu_datatag_t *tags, + int n_tag); int neu_adapter_driver_add_tag(neu_adapter_driver_t *driver, const char *group, neu_datatag_t *tag, uint16_t interval); int neu_adapter_driver_del_tag(neu_adapter_driver_t *driver, const char *group, diff --git a/src/base/group.c b/src/base/group.c index a7cf2154..d2f08f02 100644 --- a/src/base/group.c +++ b/src/base/group.c @@ -93,6 +93,20 @@ int neu_group_set_name(neu_group_t *group, const char *name) return 0; } +int neu_group_check_name(neu_group_t *group, const char *name) +{ + tag_elem_t *el = NULL; + + pthread_mutex_lock(&group->mtx); + HASH_FIND_STR(group->tags, name, el); + if (el != NULL) { + pthread_mutex_unlock(&group->mtx); + return NEU_ERR_TAG_NAME_CONFLICT; + } + pthread_mutex_unlock(&group->mtx); + return NEU_ERR_SUCCESS; +} + uint32_t neu_group_get_interval(const neu_group_t *group) { uint32_t interval = 0; diff --git a/src/base/group.h b/src/base/group.h index 787970d7..4c56e9d9 100644 --- a/src/base/group.h +++ b/src/base/group.h @@ -31,6 +31,7 @@ typedef struct neu_group neu_group_t; neu_group_t *neu_group_new(const char *name, uint32_t interval); const char * neu_group_get_name(const neu_group_t *group); int neu_group_set_name(neu_group_t *group, const char *name); +int neu_group_check_name(neu_group_t *group, const char *name); uint32_t neu_group_get_interval(const neu_group_t *group); void neu_group_set_interval(neu_group_t *group, uint32_t interval); void neu_group_destroy(neu_group_t *group);