From ca8c6ac01d91d04d3d1d773be99e5d3f1b3e656c Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Mon, 11 Dec 2023 10:43:57 +1100 Subject: [PATCH] removes service of a module if it not present in new configuration of the module --- src/lib66/module/parse_module.c | 8 +-- src/lib66/parse/parse_db_migrate.c | 81 +++++++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/lib66/module/parse_module.c b/src/lib66/module/parse_module.c index 9c5deade..0b168220 100644 --- a/src/lib66/module/parse_module.c +++ b/src/lib66/module/parse_module.c @@ -314,6 +314,10 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int } + /** append the module name at each inner depends/requiredby dependencies service name + * and define contents field.*/ + parse_rename_interdependences(res, name, ares, areslen) ; + /** Remove the module name from requiredby field * of the dependencies if the service disappears with the * fresh parse process. @@ -333,10 +337,6 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int * compare it with the new one.*/ parse_db_migrate(res, info) ; - /** append the module name at each inner depends/requiredby dependencies service name - * and define contents field.*/ - parse_rename_interdependences(res, name, ares, areslen) ; - free(wres) ; stralloc_free(&list) ; } diff --git a/src/lib66/parse/parse_db_migrate.c b/src/lib66/parse/parse_db_migrate.c index c5bf8b9b..a505c8d2 100644 --- a/src/lib66/parse/parse_db_migrate.c +++ b/src/lib66/parse/parse_db_migrate.c @@ -12,11 +12,87 @@ * except according to the terms contained in the LICENSE file./ */ +#include <stdint.h> + #include <oblibs/log.h> +#include <oblibs/stack.h> +#include <oblibs/string.h> #include <66/service.h> #include <66/resolve.h> #include <66/ssexec.h> +#include <66/tree.h> +#include <66/constants.h> + +static void service_db_tree(resolve_service_t *old, resolve_service_t *new, ssexec_t *info) +{ + log_flow() ; + + char *ocontents = old->sa.s + old->dependencies.contents ; + char *ncontents = new->sa.s + new->dependencies.contents ; + + size_t pos = 0, olen = strlen(ocontents) ; + _init_stack_(sremove, olen + 1) ; + + { + _init_stack_(sold, olen + 1) ; + + if (!stack_convert_string_g(&sold, ocontents)) + log_dieusys(LOG_EXIT_SYS, "convert string") ; + + { + size_t nlen = strlen(ncontents) ; + _init_stack_(snew, nlen + 1) ; + + if (!stack_convert_string_g(&snew, ncontents)) + log_dieusys(LOG_EXIT_SYS, "convert string") ; + + FOREACH_STK(&sold, pos) { + if (stack_retrieve_element(&snew, sold.s + pos) < 0) { + if (!stack_add_g(&sremove, sold.s + pos)) + log_dieu(LOG_EXIT_SYS, "add string") ; + } + } + } + } + + if (sremove.len) { + + unsigned int m = 0 ; + int nargc = 3 + sremove.count ; + char const *prog = PROG ; + char const *newargv[nargc] ; + + char const *help = info->help ; + char const *usage = info->usage ; + + info->help = help_remove ; + info->usage = usage_remove ; + + newargv[m++] = "remove" ; + newargv[m++] = "-P" ; + + pos = 0 ; + FOREACH_STK(&sremove, pos) { + + char *name = sremove.s + pos ; + if (get_rstrlen_until(name, SS_LOG_SUFFIX) < 0) + newargv[m++] = name ; + } + + newargv[m] = 0 ; + + PROG= "remove" ; + int e = ssexec_remove(m, newargv, info) ; + PROG = prog ; + + info->help = help ; + info->usage = usage ; + + if (e) + log_dieu(LOG_EXIT_SYS, "unable to remove selection from module: ", new->sa.s + new->name) ; + } +} void parse_db_migrate(resolve_service_t *res, ssexec_t *info) { @@ -42,6 +118,9 @@ void parse_db_migrate(resolve_service_t *res, ssexec_t *info) /* requiredby */ service_db_migrate(&ores, res, info->base.s, 1) ; + + /* contents of the previous tree */ + service_db_tree(&ores, res, info) ; } resolve_free(owres) ; -} \ No newline at end of file +} -- GitLab