mirror of
https://github.com/emqx/neuron.git
synced 2026-10-24 10:46:39 +08:00
Merge pull request #2782 from fengzeroz/main
add api: check name dup before add tag
This commit is contained in:
@@ -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
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user