From cbbba80080a364d8efeae75844c3fd90352c5490 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Thu, 27 Apr 2023 17:31:27 +0800 Subject: [PATCH] feat(core): persist data when add/update/del template tags --- src/core/manager.c | 10 ++- src/core/storage.c | 153 ++++++++++++++++++++++++++++++++++++++++++++- src/core/storage.h | 17 +++++ 3 files changed, 174 insertions(+), 6 deletions(-) diff --git a/src/core/manager.c b/src/core/manager.c index fe7ab9ad..066a8b4f 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -387,7 +387,8 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) resp.error = neu_manager_add_template_tags(manager, cmd, &resp.index); if (resp.index > 0) { - // TODO: storage + manager_storage_add_template_tags(cmd->tmpl, cmd->group, cmd->tags, + cmd->n_tag); } neu_req_add_template_tag_fini(cmd); @@ -405,7 +406,8 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) resp.error = neu_manager_update_template_tags(manager, cmd, &resp.index); if (resp.index > 0) { - // TODO: storage + manager_storage_update_template_tags(cmd->tmpl, cmd->group, + cmd->tags, cmd->n_tag); } neu_req_update_template_tag_fini(cmd); @@ -422,7 +424,9 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) resp.error = neu_manager_del_template_tags(manager, cmd); if (0 == resp.error) { - // TODO: storage + manager_storage_del_template_tags(cmd->tmpl, cmd->group, + (const char *const *) cmd->tags, + cmd->n_tag); } neu_req_del_template_tag_fini(cmd); diff --git a/src/core/storage.c b/src/core/storage.c index 078803a4..d72b5dbf 100644 --- a/src/core/storage.c +++ b/src/core/storage.c @@ -85,7 +85,7 @@ void manager_storage_unsubscribe(neu_manager_t *manager, const char *app, } } -static int save_group_and_tags(neu_group_t *grp, void *data) +static int save_node_group_and_tags(neu_group_t *grp, void *data) { const char *node = data; const char *name = neu_group_get_name(grp); @@ -117,13 +117,32 @@ void manager_storage_inst_node(neu_manager_t *manager, const char *tmpl_name, manager_storage_add_node(manager, node); - int rv = - neu_template_for_each_group(tmpl, save_group_and_tags, (void *) node); + int rv = neu_template_for_each_group(tmpl, save_node_group_and_tags, + (void *) node); if (0 != rv) { nlog_error("save instantiated node `%s` groups and tags fail", node); } } +static int save_tmpl_group_and_tags(neu_group_t *grp, void *data) +{ + const char *tmpl_name = data; + const char *name = neu_group_get_name(grp); + uint32_t interval = neu_group_get_interval(grp); + + UT_array *tags = neu_group_get_tag(grp); + if (NULL == tags) { + return NEU_ERR_EINTERNAL; + } + + manager_storage_add_template_group(tmpl_name, name, interval); + manager_storage_add_template_tags(tmpl_name, name, utarray_front(tags), + utarray_len(tags)); + + utarray_free(tags); + return 0; +} + void manager_storage_add_template(neu_manager_t *manager, const char *tmpl_name) { neu_template_t *tmpl = @@ -136,6 +155,13 @@ void manager_storage_add_template(neu_manager_t *manager, const char *tmpl_name) int rv = neu_persister_store_template(tmpl_name, neu_template_plugin(tmpl)); if (0 != rv) { nlog_error("failed to store template info"); + return; + } + + rv = neu_template_for_each_group(tmpl, save_tmpl_group_and_tags, + (void *) tmpl_name); + if (0 != rv) { + nlog_error("save template `%s` groups and tags fail", tmpl_name); } } @@ -159,6 +185,127 @@ void manager_storage_clear_templates(neu_manager_t *manager) } } +void manager_storage_add_template_group(const char *tmpl, const char *group, + uint32_t interval) +{ + neu_persist_group_info_t info = { + .name = (char *) group, + .interval = interval, + }; + + int rv = neu_persister_store_template_group(tmpl, &info); + if (0 != rv) { + nlog_error("store template:%s grp:%s, interval:%" PRIu32 " fail", tmpl, + group, interval); + } +} + +void manager_storage_update_template_group(const char *tmpl, const char *group, + uint32_t interval) +{ + neu_persist_group_info_t info = { + .name = (char *) group, + .interval = interval, + }; + + int rv = neu_persister_update_template_group(tmpl, &info); + if (0 != rv) { + nlog_error("update template:%s grp:%s, interval:%" PRIu32 " fail", tmpl, + group, interval); + } +} + +void manager_storage_del_template_group(const char *tmpl, const char *group) +{ + int rv = neu_persister_delete_template_group(tmpl, group); + if (0 != rv) { + nlog_error("delete template:%s grp:%s fail" PRIu32, tmpl, group); + } +} + +void manager_storage_add_template_tag(const char *tmpl, const char *group, + const neu_datatag_t *tag) +{ + int rv = neu_persister_store_template_tags(tmpl, group, tag, 1); + if (0 != rv) { + nlog_error("store tag:%s template:%s grp:%s fail", tag->name, tmpl, + group); + } +} + +void manager_storage_add_template_tags(const char *tmpl, const char *group, + const neu_datatag_t *tags, size_t n) +{ + if (0 == n) { + return; + } + + if (1 == n) { + return manager_storage_add_template_tag(tmpl, group, &tags[0]); + } + + int rv = neu_persister_store_template_tags(tmpl, group, tags, n); + if (0 != rv) { + nlog_error("store %zu tags:[%s ... %s] template:%s grp:%s fail", n, + tags->name, tags[n - 1].name, tmpl, group); + } +} + +void manager_storage_update_template_tag(const char *tmpl, const char *group, + const neu_datatag_t *tag) +{ + int rv = neu_persister_update_template_tags(tmpl, group, tag, 1); + if (0 != rv) { + nlog_error("update tag:%s template:%s grp:%s fail", tag->name, tmpl, + group); + } +} + +void manager_storage_update_template_tags(const char *tmpl, const char *group, + const neu_datatag_t *tags, size_t n) +{ + if (0 == n) { + return; + } + + if (1 == n) { + return manager_storage_update_template_tag(tmpl, group, &tags[0]); + } + + int rv = neu_persister_update_template_tags(tmpl, group, tags, n); + if (0 != rv) { + nlog_error("update %zu tags:[%s ... %s] template:%s grp:%s fail", n, + tags->name, tags[n - 1].name, tmpl, group); + } +} + +void manager_storage_del_template_tag(const char *tmpl, const char *group, + const char *tag) +{ + int rv = neu_persister_delete_template_tags(tmpl, group, &tag, 1); + if (0 != rv) { + nlog_error("delete tag:%s template:%s grp:%s fail", tag, tmpl, group); + } +} + +void manager_storage_del_template_tags(const char *tmpl, const char *group, + const char *const *tags, size_t n) +{ + if (0 == n) { + return; + } + + if (1 == n) { + return manager_storage_del_template_tag(tmpl, group, tags[0]); + } + + int rv = neu_persister_delete_template_tags(tmpl, group, tags, n); + if (0 != rv) { + nlog_error("del %zu tags:[%s ... %s] template:%s grp:%s fail", n, + tags[0], tags[n - 1], tmpl, group); + } +} + int manager_load_plugin(neu_manager_t *manager) { UT_array *plugin_infos = NULL; diff --git a/src/core/storage.h b/src/core/storage.h index 22faf0c0..18922253 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -41,6 +41,23 @@ void manager_storage_add_template(neu_manager_t *manager, void manager_storage_del_template(neu_manager_t *manager, const char * tmpl_name); void manager_storage_clear_templates(neu_manager_t *manager); +void manager_storage_add_template_group(const char *tmpl, const char *group, + uint32_t interval); +void manager_storage_update_template_group(const char *tmpl, const char *group, + uint32_t interval); +void manager_storage_del_template_group(const char *tmpl, const char *group); +void manager_storage_add_template_tag(const char *tmpl, const char *group, + const neu_datatag_t *tag); +void manager_storage_add_template_tags(const char *tmpl, const char *group, + const neu_datatag_t *tags, size_t n); +void manager_storage_update_template_tag(const char *tmpl, const char *group, + const neu_datatag_t *tag); +void manager_storage_update_template_tags(const char *tmpl, const char *group, + const neu_datatag_t *tags, size_t n); +void manager_storage_del_template_tag(const char *tmpl, const char *group, + const char *tag); +void manager_storage_del_template_tags(const char *tmpl, const char *group, + const char *const *tags, size_t n); int manager_load_plugin(neu_manager_t *manager); int manager_load_node(neu_manager_t *manager);