Merge pull request #2782 from fengzeroz/main

add api: check name dup before add tag
This commit is contained in:
fengzeroz
2026-06-11 11:10:46 +08:00
committed by GitHub
6 changed files with 142 additions and 59 deletions
+62 -49
View File
@@ -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);
});
}
}
}
}
+41 -10
View File
@@ -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;
+21
View File
@@ -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)
{
+3
View File
@@ -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,
+14
View File
@@ -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;
+1
View File
@@ -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);