From 0c4b45ab2f3b8ac5cd432727af36225bd1c0643c Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Thu, 9 Jan 2020 20:25:52 +0700
Subject: [PATCH] [*] Big rework. Not delete and update actions need unleased
 'key' and 'value' pointers

---
 dap_chain_net.c          |  2 +-
 dap_chain_node.c         | 18 ++++++++------
 dap_chain_node_cli_cmd.c | 51 +++++++++++++++++++++++-----------------
 3 files changed, 41 insertions(+), 30 deletions(-)

diff --git a/dap_chain_net.c b/dap_chain_net.c
index 7d72cf77b2..a2da73d72c 100755
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -1864,7 +1864,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
             // Delete processed objects
             size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
             for(size_t i = 0; i < l_objs_processed; i++) {
-                if(dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool))
+                if(dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool))
                     s_net_set_go_sync(a_net);
                 if(i < l_objs_processed_tmp) {
                     dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
diff --git a/dap_chain_node.c b/dap_chain_node.c
index 0e9ff6584e..e0a8dfb2cb 100644
--- a/dap_chain_node.c
+++ b/dap_chain_node.c
@@ -84,11 +84,13 @@ bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *ad
 bool dap_chain_node_alias_register(dap_chain_net_t * a_net,const char *alias, dap_chain_node_addr_t *addr)
 {
     char *a_key = strdup(alias);
+    dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t);
+    memcpy(l_addr,addr,sizeof (*l_addr));
 //    char a_value[2 * sizeof(dap_chain_node_addr_t) + 1];
 //    if(bin2hex(a_value, (const unsigned char *) addr, sizeof(dap_chain_node_addr_t)) == -1)
 //        return false;
 //    a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0';
-    bool res = dap_chain_global_db_gr_set(a_key,  addr, sizeof(dap_chain_node_addr_t)
+    bool res = dap_chain_global_db_gr_set( dap_strdup(a_key),  l_addr, sizeof(dap_chain_node_addr_t)
                                           , a_net->pub.gdb_nodes_aliases);
     if(res)
         s_net_set_go_sync(a_net);
@@ -140,21 +142,23 @@ size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info)
  * @param node_info
  * @return
  */
-int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *node_info)
+int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info)
 {
-    if(!node_info || !node_info->hdr.address.uint64){
-        log_it(L_ERROR,"Can't save node info: %s", node_info? "null address":"null object" );
+    if(!a_node_info || !a_node_info->hdr.address.uint64){
+        log_it(L_ERROR,"Can't save node info: %s", a_node_info? "null address":"null object" );
         return  -1;
     }
-    char *l_key = dap_chain_node_addr_to_hash_str(&node_info->hdr.address);
+    char *l_key = dap_chain_node_addr_to_hash_str(&a_node_info->hdr.address);
 
     if(!l_key){
         log_it(L_ERROR,"Can't produce key to save node info ");
         return -2;
     }
     //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
-    size_t node_info_size = dap_chain_node_info_get_size(node_info);
-    bool res = dap_chain_global_db_gr_set(l_key, node_info, node_info_size, a_net->pub.gdb_nodes);
+    size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info);
+    dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
+    memcpy(l_node_info, a_node_info, sizeof (*a_node_info) );
+    bool res = dap_chain_global_db_gr_set( dap_strdup(l_key), l_node_info, l_node_info_size, a_net->pub.gdb_nodes);
     if(res)
         s_net_set_go_sync(a_net);
     DAP_DELETE(l_key);
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 664fbc8635..a741c5dad9 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -72,8 +72,6 @@
 #include "dap_chain_node_cli_cmd_tx.h"
 #include "dap_chain_node_ping.h"
 #include "dap_chain_net_srv.h"
-#include "dap_chain_net_srv_vpn.h"
-#include "dap_chain_net_vpn_client.h"
 #include "dap_chain_cell.h"
 
 #include "dap_chain_common.h"
@@ -206,21 +204,24 @@ static dap_chain_node_info_t* node_info_read_and_reply(dap_chain_net_t * a_net,
 /**
  * Save node to base
  */
-static bool node_info_save_and_reply(dap_chain_net_t * a_net, dap_chain_node_info_t *node_info, char **str_reply)
+static bool node_info_save_and_reply(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, char **str_reply)
 {
-    if(!node_info || !node_info->hdr.address.uint64) {
+    if(!a_node_info || !a_node_info->hdr.address.uint64) {
         dap_chain_node_cli_set_reply_text(str_reply, "node addr not found");
         return false;
     }
-    char *a_key = dap_chain_node_addr_to_hash_str(&node_info->hdr.address);
+    char *a_key = dap_chain_node_addr_to_hash_str(&a_node_info->hdr.address);
     if(!a_key)
     {
         dap_chain_node_cli_set_reply_text(str_reply, "can't calculate hash for addr");
         return NULL;
     }
     //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
-    size_t node_info_size = dap_chain_node_info_get_size(node_info);
-    bool res = dap_chain_global_db_gr_set(a_key, (uint8_t *) node_info, node_info_size,a_net->pub.gdb_nodes);
+    size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info);
+    dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
+    memcpy(l_node_info, a_node_info, sizeof (*a_node_info) );
+
+    bool res = dap_chain_global_db_gr_set(a_key, (uint8_t *) l_node_info, l_node_info_size,a_net->pub.gdb_nodes);
     DAP_DELETE(a_key);
     //DAP_DELETE(a_value);
     if(res)
@@ -309,7 +310,7 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info
     if(a_key)
     {
         // delete node
-        bool res = dap_chain_global_db_gr_del(a_key, a_net->pub.gdb_nodes);
+        bool res = dap_chain_global_db_gr_del(dap_strdup(a_key), a_net->pub.gdb_nodes);
         if(res) {
             // delete all aliases for node address
             {
@@ -1840,12 +1841,12 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
 
                     // Add datum to mempool with datum_token hash as a key
-                    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
+                    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
                         s_net_set_go_sync(l_net);
 
                         char* l_hash_str = strdup(l_datum_hash_str);
                         // Remove old datum from pool
-                        if(dap_chain_global_db_gr_del( l_hash_str, l_gdb_group_mempool)) {
+                        if( dap_chain_global_db_gr_del( dap_strdup(l_hash_str) , l_gdb_group_mempool)) {
                             dap_chain_node_cli_set_reply_text(a_str_reply,
                                     "datum %s produced from %s is replacing the %s in datum pool",
                                     l_key_str, l_datum_hash_str, l_datum_hash_str);
@@ -1865,7 +1866,7 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                             return 1;
                         }
                         DAP_DELETE(l_hash_str);
-
+                        DAP_DELETE(l_key_str);
                     }
                     else {
                         dap_chain_node_cli_set_reply_text(a_str_reply,
@@ -1874,6 +1875,7 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                         DAP_DELETE(l_datum);
                         //DAP_DELETE(l_datum_token);
                         DAP_DELETE(l_gdb_group_mempool);
+                        DAP_DELETE(l_key_str);
                         return -2;
                     }
 
@@ -2004,7 +2006,7 @@ int com_mempool_delete(int argc, char ** argv, char ** a_str_reply)
         if(l_datum_hash_str) {
             char * l_datum_hash_str2 = strdup(l_datum_hash_str);
             char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
-            if(dap_chain_global_db_gr_del(l_datum_hash_str2, l_gdb_group_mempool)) {
+            if(dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_str2), l_gdb_group_mempool)) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_str);
                 DAP_DELETE( l_datum_hash_str2);
                 s_net_set_go_sync(l_net);
@@ -2097,7 +2099,7 @@ int com_mempool_proc(int argc, char ** argv, char ** a_str_reply)
             for(size_t i = 0; i < l_datums_size; i++) {
                 if(l_procecced[i]!=1)
                     continue;
-                if(dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool_tmp))
+                if(dap_chain_global_db_gr_del( dap_strdup(l_objs[i].key), l_gdb_group_mempool_tmp))
                     s_net_set_go_sync(l_net);
                 l_objs_processed_cur++;
                 if(l_objs_processed_cur < l_objs_processed_tmp) {
@@ -2289,13 +2291,14 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
         l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN);
 
     }
-    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
+    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
         s_net_set_go_sync(l_net);
         dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str,
                 l_ticker);
         DAP_DELETE(l_datum);
         DAP_DELETE(l_datum_token);
         DAP_DELETE(l_gdb_group_mempool);
+        DAP_DELETE(l_key_str);
         return 0;
     }
     else {
@@ -2303,6 +2306,7 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
         DAP_DELETE(l_datum);
         DAP_DELETE(l_datum_token);
         DAP_DELETE(l_gdb_group_mempool);
+        DAP_DELETE(l_key_str);
         return -2;
     }
 
@@ -2501,17 +2505,19 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
 //    char * l_key_str = dap_chain_hash_fast_to_str_new(&l_datum_emission_hash);
 
     // Add to mempool emission token
-    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum_emission, l_datum_emission_size
+    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum_emission, l_datum_emission_size
             , l_gdb_group_mempool_emission)) {
         s_net_set_go_sync(l_net);
         str_reply_tmp = dap_strdup_printf("datum emission %s is placed in datum pool ", l_key_str);
+        DAP_DELETE(l_key_str);
     }
     else {
         dap_chain_node_cli_set_reply_text(str_reply, "datum emission %s is not placed in datum pool ", l_key_str);
+        DAP_DELETE(l_key_str);
+        DAP_DELETE(l_datum_emission);
         return -1;
     }
-    DAP_DELETE(l_key_str);
-    DAP_DELETE(l_datum_emission);
+
 
     // create first transaction (with tx_token)
     dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
@@ -2556,19 +2562,20 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     DAP_DELETE(l_tx);
 
     // Add to mempool tx token
-    if(dap_chain_global_db_gr_set(l_key_str, l_datum_tx, l_datum_tx_size
+    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), l_datum_tx, l_datum_tx_size
             , l_gdb_group_mempool_base_tx)) {
         s_net_set_go_sync(l_net);
         dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp,
                 l_key_str);
-    }
-    else {
+        DAP_DELETE(l_key_str);
+    } else {
         dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp,
                 l_key_str);
+        DAP_DELETE(l_key_str);
+
         return -2;
     }
     DAP_DELETE(str_reply_tmp);
-    DAP_DELETE(l_key_str);
     DAP_DELETE(l_datum_tx);
     DAP_DELETE(l_addr);
     return 0;
@@ -2639,7 +2646,7 @@ int com_tx_cond_create(int argc, char ** argv, char **str_reply)
     }
     dap_chain_net_srv_uid_t l_srv_uid = { 0 };
     if(!dap_strcmp(l_service_str, "vpn"))
-        l_srv_uid.uint64 = DAP_CHAIN_NET_SRV_VPN_ID;
+        l_srv_uid.uint64 = 0x0000000000000001;
     //dap_chain_addr_t *addr_to = dap_chain_addr_from_str(l_addr_to_str);
     if(!l_srv_uid.uint64) {
         dap_chain_node_cli_set_reply_text(str_reply, "can't recognize service='%s' unit must look like {vpn}",
-- 
GitLab