From d26256f4393566c5e65e56619c971bc0905415c1 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Mon, 10 Jan 2022 19:02:15 +1100
Subject: [PATCH] add resolve_modify_field and resolve_modify_field_g function.
 Rename SERVICE_STRUCT and TREE_STRUCT to DATA_SERVICE and DATA_TREE
 respectively

---
 src/include/66/resolve.h |  10 ++--
 src/lib66/resolve.c      | 109 ++++++++++++++++++++++++++++++++++-----
 2 files changed, 101 insertions(+), 18 deletions(-)

diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h
index 0d542dce..c4ddcc8c 100644
--- a/src/include/66/resolve.h
+++ b/src/include/66/resolve.h
@@ -48,11 +48,12 @@ struct resolve_wrapper_s
     void *obj ;
 } ;
 
+#ifndef RESOLVE_SET_SAWRES
 #define RESOLVE_SET_SAWRES(wres) \
     stralloc_ref sawres = 0 ; \
-    if (wres->type == SERVICE_STRUCT) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \
-    else if (wres->type == TREE_STRUCT) sawres = (&((resolve_tree_t *)wres->obj)->sa) ;
-
+    if (wres->type == DATA_SERVICE) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \
+    else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ;
+#endif
 /**
  *
  * General API
@@ -69,7 +70,8 @@ extern int resolve_search(genalloc *ga, char const *name, uint8_t type) ;
 extern int resolve_cmp(genalloc *ga, char const *name, uint8_t type) ;
 extern void resolve_rmfile(char const *src,char const *name) ;
 extern ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data) ;
-
+extern int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *by) ;
+extern int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *element, uint8_t field, char const *value) ;
 /**
  *
  * Freed
diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c
index 177fdb28..214c2164 100644
--- a/src/lib66/resolve.c
+++ b/src/lib66/resolve.c
@@ -22,6 +22,7 @@
 #include <oblibs/log.h>
 #include <oblibs/string.h>
 #include <oblibs/types.h>
+#include <oblibs/sastr.h>
 
 #include <skalibs/stralloc.h>
 #include <skalibs/genalloc.h>
@@ -34,6 +35,8 @@
 #include <66/resolve.h>
 #include <66/service.h>
 #include <66/tree.h>
+#include <66/constants.h>
+#include <66/graph.h>
 
 /**
  *
@@ -52,6 +55,7 @@ resolve_wrapper_t *resolve_set_struct(uint8_t type, void *s)
     return wres ;
 } ;
 
+
 int resolve_init(resolve_wrapper_t *wres)
 {
     log_flow() ;
@@ -119,7 +123,7 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres)
 
     int e = 0 ;
 
-    if (wres->type == SERVICE_STRUCT) {
+    if (wres->type == DATA_SERVICE) {
 
         resolve_service_t cp = RESOLVE_SERVICE_ZERO ;
         if (!service_resolve_copy(&cp, ((resolve_service_t *)wres->obj)))
@@ -128,7 +132,7 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres)
         if (!genalloc_append(resolve_service_t, ga, &cp))
             goto err ;
 
-    } else if (wres->type == TREE_STRUCT) {
+    } else if (wres->type == DATA_TREE) {
 
         resolve_tree_t cp = RESOLVE_TREE_ZERO ;
         if (!tree_resolve_copy(&cp, ((resolve_tree_t *)wres->obj)))
@@ -150,7 +154,7 @@ int resolve_search(genalloc *ga, char const *name, uint8_t type)
 
     size_t len, pos = 0 ;
 
-    if (type == SERVICE_STRUCT) {
+    if (type == DATA_SERVICE) {
 
         len = genalloc_len(resolve_service_t, ga) ;
 
@@ -161,7 +165,7 @@ int resolve_search(genalloc *ga, char const *name, uint8_t type)
                 return pos ;
         }
 
-    } else if (type == TREE_STRUCT) {
+    } else if (type == DATA_TREE) {
 
         len = genalloc_len(resolve_tree_t, ga) ;
 
@@ -182,7 +186,7 @@ int resolve_cmp(genalloc *ga, char const *name, uint8_t type)
 
     size_t len, pos = 0 ;
 
-    if (type == SERVICE_STRUCT) {
+    if (type == DATA_SERVICE) {
 
         len = genalloc_len(resolve_service_t, ga) ;
 
@@ -194,7 +198,7 @@ int resolve_cmp(genalloc *ga, char const *name, uint8_t type)
                 return 1 ;
         }
 
-    } else if (type == TREE_STRUCT) {
+    } else if (type == DATA_TREE) {
 
         len = genalloc_len(resolve_tree_t, ga) ;
 
@@ -247,6 +251,84 @@ ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data)
     return baselen ;
 }
 
+int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *by)
+{
+    log_flow() ;
+
+    int e = 0 ;
+
+    resolve_wrapper_t_ref mwres = 0 ;
+
+    if (wres->type == DATA_SERVICE) {
+
+        resolve_service_t_ref res = (resolve_service_t *)wres->obj  ;
+        mwres = resolve_set_struct(DATA_SERVICE, res) ;
+
+        log_trace("modify field ", resolve_service_field_table[field].field," of service ", res->sa.s + res->name, " with value: ", by) ;
+
+        if (!service_resolve_modify_field(res, field, by))
+            goto err ;
+
+    } else if (wres-> type == DATA_TREE) {
+
+        resolve_tree_t_ref res = (resolve_tree_t *)wres->obj  ;
+        mwres = resolve_set_struct(DATA_TREE, res) ;
+
+        log_trace("modify field ", resolve_tree_field_table[field].field," of tree ", res->sa.s + res->name, " with value: ", by) ;
+
+        if (!tree_resolve_modify_field(res, field, by))
+            goto err ;
+
+    }
+    e = 1 ;
+    err:
+        free(mwres) ;
+        return e ;
+}
+
+int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char const *element, uint8_t field, char const *value)
+{
+
+    log_flow() ;
+
+    size_t baselen = strlen(base), tot = 0, treelen = 0 ;
+    char *treename = 0 ;
+
+    if (wres->type == DATA_SERVICE) {
+
+        treelen = strlen(((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename) ;
+        tot = baselen + SS_SYSTEM_LEN + 1 + treelen + SS_SVDIRS_LEN + 1 ;
+
+    } else {
+
+        tot = baselen + SS_SYSTEM_LEN + 1 ;
+    }
+
+    char solve[tot] ;
+
+    if (wres->type == DATA_SERVICE) {
+
+        treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ;
+        auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ;
+
+    } else {
+
+        auto_strings(solve, base, SS_SYSTEM) ;
+    }
+
+    if (!resolve_read(wres, solve, element))
+        log_warnusys_return(LOG_EXIT_ZERO, "read resolve file of: ", solve, "/", element) ;
+
+    if (!resolve_modify_field(wres, field, value))
+        log_warnusys_return(LOG_EXIT_ZERO, "modify resolve file of: ", solve, "/", element) ;
+
+    if (!resolve_write(wres, solve, element))
+        log_warnusys_return(LOG_EXIT_ZERO, "write resolve file of :", solve, "/", element) ;
+
+    return 1 ;
+
+}
+
 /**
  *
  * FREED
@@ -270,14 +352,14 @@ void resolve_deep_free(uint8_t type, genalloc *g)
 
     size_t pos = 0 ;
 
-    if (type == SERVICE_STRUCT) {
+    if (type == DATA_SERVICE) {
 
         for (; pos < genalloc_len(resolve_service_t, g) ; pos++)
             stralloc_free(&genalloc_s(resolve_service_t, g)[pos].sa) ;
 
         genalloc_free(resolve_service_t, g) ;
 
-    } else if (type == TREE_STRUCT) {
+    } else if (type == DATA_TREE) {
 
         for (; pos < genalloc_len(resolve_tree_t, g) ; pos++)
             stralloc_free(&genalloc_s(resolve_tree_t, g)[pos].sa) ;
@@ -311,12 +393,12 @@ int resolve_read_cdb(resolve_wrapper_t *wres, char const *name)
         goto err ;
     }
 
-    if (wres->type == SERVICE_STRUCT) {
+    if (wres->type == DATA_SERVICE) {
 
         if (!service_read_cdb(&c, ((resolve_service_t *)wres->obj)))
             goto err ;
 
-    } else if (wres->type == TREE_STRUCT){
+    } else if (wres->type == DATA_TREE){
 
         if (!tree_read_cdb(&c, ((resolve_tree_t *)wres->obj)))
             goto err ;
@@ -357,12 +439,12 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name
         goto err ;
     }
 
-    if (wres->type == SERVICE_STRUCT) {
+    if (wres->type == DATA_SERVICE) {
 
         if (!service_write_cdb(&c, ((resolve_service_t *)wres->obj)))
             goto err ;
 
-    } else if (wres->type == TREE_STRUCT) {
+    } else if (wres->type == DATA_TREE) {
 
         if (!tree_write_cdb(&c, ((resolve_tree_t *)wres->obj)))
             goto err ;
@@ -432,7 +514,7 @@ int resolve_find_cdb(stralloc *result, cdb const *c, char const *key)
         log_warnusys_return(LOG_EXIT_LESSONE,"search on cdb key: ",key) ;
 
     if (!r)
-        log_warnusys_return(LOG_EXIT_ZERO,"unknown cdb key: ",key) ;
+        log_warn_return(LOG_EXIT_ZERO,"unknown cdb key: ",key) ;
 
     char pack[cdata.len + 1] ;
     memcpy(pack,cdata.s, cdata.len) ;
@@ -446,4 +528,3 @@ int resolve_find_cdb(stralloc *result, cdb const *c, char const *key)
     return x ;
 }
 
-
-- 
GitLab