From de835bb824e5304ab8c96099dd1e7c95f7249ae9 Mon Sep 17 00:00:00 2001
From: Aleksandr Lysikov <lysikov@inbox.ru>
Date: Tue, 14 May 2019 16:26:34 +0500
Subject: [PATCH] prepere to "master->feature2272"

---
 dap_chain_node_cli_cmd.c | 278 +++++++++++++++++++--------------------
 1 file changed, 139 insertions(+), 139 deletions(-)

diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 803f13ef08..4c913f55c3 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -75,7 +75,7 @@ dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(const char *a_alias)
         return NULL;
     const char *a_key = a_alias;
     size_t l_addr_size = 0;
-    l_addr = (dap_chain_node_addr_t*) (void*) dap_chain_global_db_gr_get(a_key, &l_addr_size, GROUP_ALIAS);
+    l_addr = (dap_chain_node_addr_t*) (void*) dap_chain_global_db_gr_get(a_key, &l_addr_size, GROUP_GLOBAL_ALIAS);
     if(l_addr_size != sizeof(dap_chain_node_addr_t)) {
 //        l_addr = DAP_NEW_Z(dap_chain_node_addr_t);
 //        if(hex2bin((char*) l_addr, (const unsigned char *) addr_str, sizeof(dap_chain_node_addr_t) * 2) == -1) {
@@ -99,7 +99,7 @@ static dap_list_t* get_aliases_by_name(dap_chain_node_addr_t *a_addr)
     dap_list_t *list_aliases = NULL;
     size_t data_size = 0;
     // read all aliases
-    dap_global_db_obj_t **objs = dap_chain_global_db_gr_load(GROUP_ALIAS, &data_size);
+    dap_global_db_obj_t **objs = dap_chain_global_db_gr_load(GROUP_GLOBAL_ALIAS, &data_size);
     if(!objs || !data_size)
         return NULL;
     for(size_t i = 0; i < data_size; i++) {
@@ -140,18 +140,13 @@ static dap_chain_node_addr_t* com_global_db_get_addr(dap_chain_node_info_t *node
     return address;
 }
 
-char* com_global_db_get_key_for_addr(dap_chain_node_addr_t *address)
-{
-    char *a_key = dap_chain_global_db_hash((const uint8_t*) address, sizeof(dap_chain_node_addr_t));
-    return a_key;
-}
 
 /**
  * Read node from base
  */
-static dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_node_addr_t *address, char **str_reply)
+static dap_chain_node_info_t* dap_chain_node_info_read_and_reply(dap_chain_node_addr_t *address, char **str_reply)
 {
-    char *l_key = com_global_db_get_key_for_addr(address);
+    char *l_key = dap_chain_node_addr_to_hash_str(address);
     if(!l_key)
     {
         dap_chain_node_cli_set_reply_text(str_reply, "can't calculate hash of addr");
@@ -160,7 +155,7 @@ static dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_node_addr_t *ad
     size_t node_info_size = 0;
     dap_chain_node_info_t *node_info;
     // read node
-    node_info = (dap_chain_node_info_t *) dap_chain_global_db_gr_get(l_key, &node_info_size, GROUP_NODE);
+    node_info = (dap_chain_node_info_t *) dap_chain_global_db_gr_get(l_key, &node_info_size, GROUP_GLOBAL_ADDRS_LEASED);
 
     if(!node_info) {
         dap_chain_node_cli_set_reply_text(str_reply, "node not found in base");
@@ -188,13 +183,13 @@ static dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_node_addr_t *ad
 /**
  * Save node to base
  */
-static bool dap_chain_node_info_save(dap_chain_node_info_t *node_info, char **str_reply)
+static bool dap_chain_node_info_save_and_reply(dap_chain_node_info_t *node_info, char **str_reply)
 {
     if(!node_info || !node_info->hdr.address.uint64) {
         dap_chain_node_cli_set_reply_text(str_reply, "node addr not found");
         return false;
     }
-    char *a_key = com_global_db_get_key_for_addr(&node_info->hdr.address);
+    char *a_key = dap_chain_node_addr_to_hash_str(&node_info->hdr.address);
     if(!a_key)
     {
         dap_chain_node_cli_set_reply_text(str_reply, "can't calculate hash for addr");
@@ -202,22 +197,26 @@ static bool dap_chain_node_info_save(dap_chain_node_info_t *node_info, char **st
     }
     //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, (const uint8_t *) node_info, node_info_size, GROUP_NODE);
+    bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t *) node_info, node_info_size, GROUP_GLOBAL_ADDRS_LEASED);
     DAP_DELETE(a_key);
     //DAP_DELETE(a_value);
     return res;
 }
+
+
+
+
 /**
  * Handler of command 'global_db node add'
  *
  * str_reply[out] for reply
  * return 0 Ok, -1 error
  */
-static int com_global_db_add(dap_chain_node_info_t *node_info, const char *alias_str,
+static int com_global_db_add(dap_chain_node_info_t *a_node_info, const char *alias_str,
         const char *cell_str, const char *ipv4_str, const char *ipv6_str, char **str_reply)
 {
 
-    if(!node_info->hdr.address.uint64) {
+    if(!a_node_info->hdr.address.uint64) {
         dap_chain_node_cli_set_reply_text(str_reply, "not found -addr parameter");
         return -1;
     }
@@ -231,9 +230,9 @@ static int com_global_db_add(dap_chain_node_info_t *node_info, const char *alias
     }
     else {
         if(ipv4_str)
-            inet_pton(AF_INET, ipv4_str, &(node_info->hdr.ext_addr_v4));
+            inet_pton(AF_INET, ipv4_str, &(a_node_info->hdr.ext_addr_v4));
         if(ipv6_str)
-            inet_pton(AF_INET6, ipv6_str, &(node_info->hdr.ext_addr_v6));
+            inet_pton(AF_INET6, ipv6_str, &(a_node_info->hdr.ext_addr_v6));
     }
     // check match addr to cell or no
     /*dap_chain_node_addr_t *addr = dap_chain_node_gen_addr(&node_info->hdr.cell_id);
@@ -243,16 +242,16 @@ static int com_global_db_add(dap_chain_node_info_t *node_info, const char *alias
      }*/
     if(alias_str) {
         // add alias
-        if(!dap_chain_node_alias_register(alias_str, &node_info->hdr.address)) {
+        if(!dap_chain_node_alias_register(alias_str, &a_node_info->hdr.address)) {
             log_it(L_WARNING, "can't save alias %s", alias_str);
             dap_chain_node_cli_set_reply_text(str_reply, "alias '%s' can't be mapped to addr=0x%lld",
-                    alias_str, node_info->hdr.address.uint64);
+                    alias_str, a_node_info->hdr.address.uint64);
             return -1;
         }
     }
 
     // write to base
-    bool res = dap_chain_node_info_save(node_info, str_reply);
+    bool res = dap_chain_node_info_save_and_reply(a_node_info, str_reply);
     if(res)
         dap_chain_node_cli_set_reply_text(str_reply, "node added");
     else
@@ -287,11 +286,11 @@ static int com_global_db_del(dap_chain_node_info_t *node_info, const char *alias
         dap_chain_node_cli_set_reply_text(str_reply, "alias not found");
         return -1;
     }
-    char *a_key = com_global_db_get_key_for_addr(address);
+    char *a_key = dap_chain_node_addr_to_hash_str(address);
     if(a_key)
     {
         // delete node
-        bool res = dap_chain_global_db_gr_del(a_key, GROUP_NODE);
+        bool res = dap_chain_global_db_gr_del(a_key, GROUP_GLOBAL_ADDRS_LEASED);
         if(res) {
             // delete all aliases for node address
             {
@@ -341,7 +340,7 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     }
     // TODO check the presence of link in the node base
     if(0) {
-        dap_chain_node_cli_set_reply_text(str_reply, "node 0x%llx not found in base", link->uint64);
+        dap_chain_node_cli_set_reply_text(str_reply, "node 0x%016llx not found in base", link->uint64);
         return -1;
     }
 
@@ -351,8 +350,11 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
         dap_chain_node_cli_set_reply_text(str_reply, "alias not found");
         return -1;
     }
-    dap_chain_node_info_t *node_info_read = dap_chain_node_info_read(address, str_reply);
-    if(!node_info_read)
+
+
+    dap_chain_node_info_t * l_node_info_read = dap_chain_node_info_read_and_reply(address, str_reply);
+    size_t l_node_info_read_size = dap_chain_node_info_get_size( l_node_info_read);
+    if(! l_node_info_read)
         return -1;
 
     int cmd_int = 0;
@@ -363,10 +365,10 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
 
     // find link in node_info_read
     int index_link = -1;
-    for(size_t i = 0; i < node_info_read->hdr.links_number; i++) {
-        if(node_info_read->links[i].uint64 == link->uint64) {
+    for(size_t i = 0; i <  l_node_info_read->hdr.links_number; i++) {
+        if( l_node_info_read->links[i].uint64 == link->uint64) {
             // link already present
-            index_link = i;
+            index_link = (int) i;
             break;
         }
     }
@@ -374,8 +376,9 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     // add link
     if(cmd_int == 1) {
         if(index_link == -1) {
-            memcpy(&(node_info_read->links[node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t));
-            node_info_read->hdr.links_number++;
+            l_node_info_read = DAP_REALLOC ( l_node_info_read,l_node_info_read_size += sizeof (*link) );
+            memcpy(&( l_node_info_read->links[ l_node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t));
+             l_node_info_read->hdr.links_number++;
             res_successful = true;
         }
     }
@@ -383,16 +386,17 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     else if(cmd_int == 2) {
         // move link list to one item prev
         if(index_link >= 0) {
-            for(unsigned int j = (unsigned int) index_link; j < (node_info_read->hdr.links_number - 1); j++) {
-                memcpy(&(node_info_read->links[j]), &(node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t));
+            for(unsigned int j = (unsigned int) index_link; j < ( l_node_info_read->hdr.links_number - 1); j++) {
+                memcpy(&( l_node_info_read->links[j]), &( l_node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t));
             }
-            node_info_read->hdr.links_number--;
+            l_node_info_read->hdr.links_number--;
             res_successful = true;
+            l_node_info_read = DAP_REALLOC ( l_node_info_read,l_node_info_read_size -= sizeof (*link) );
         }
     }
     // save edited node_info
     if(res_successful) {
-        bool res = dap_chain_node_info_save(node_info_read, str_reply);
+        bool res = dap_chain_node_info_save_and_reply( l_node_info_read, str_reply);
         if(res) {
             res_successful = true;
             if(cmd_int == 1)
@@ -420,7 +424,7 @@ static int com_global_db_link(dap_chain_node_info_t *node_info, const char *cmd,
     }
 
     DAP_DELETE(address);
-    DAP_DELETE(node_info_read);
+    DAP_DELETE( l_node_info_read);
     if(res_successful)
         return 0;
     return -1;
@@ -444,7 +448,7 @@ static int com_global_db_dump(dap_chain_node_info_t *a_node_info, const char *al
         // read all nodes
         dap_chain_node_info_t *node_info;
         // read all node
-        l_objs = dap_chain_global_db_gr_load(GROUP_NODE, &l_nodes_count);
+        l_objs = dap_chain_global_db_gr_load(GROUP_GLOBAL_ADDRS_LEASED, &l_nodes_count);
         /*for(size_t i = 0; i < l_nodes_count; i++) {
          dap_global_db_obj_t *l_obj = l_objs[i];
          dap_chain_node_info_t *node_info = (dap_chain_node_info_t *) l_obj->value;
@@ -467,7 +471,7 @@ static int com_global_db_dump(dap_chain_node_info_t *a_node_info, const char *al
             break;
         }
         // read node
-        dap_chain_node_info_t *node_info_read = dap_chain_node_info_read(address, str_reply);
+        dap_chain_node_info_t *node_info_read = dap_chain_node_info_read_and_reply(address, str_reply);
         if(!node_info_read) {
             DAP_DELETE(address);
             break;
@@ -501,9 +505,9 @@ static int com_global_db_dump(dap_chain_node_info_t *a_node_info, const char *al
 
         // get links in form of string
         dap_string_t *links_string = dap_string_new(NULL);
-        for(int i = 0; i < node_info_read->hdr.links_number; i++) {
+        for(unsigned int i = 0; i < node_info_read->hdr.links_number; i++) {
             dap_chain_node_addr_t link_addr = node_info_read->links[i];
-            dap_string_append_printf(links_string, "\nlink%02d address : 0x%llx", i, link_addr.uint64);
+            dap_string_append_printf(links_string, "\nlink%02d address : 0x%016llx", i, link_addr.uint64);
         }
 
         if(i)
@@ -511,14 +515,14 @@ static int com_global_db_dump(dap_chain_node_info_t *a_node_info, const char *al
         // set short reply with node param
         if(l_objs)
             dap_string_append_printf(l_string_reply,
-                    "node address 0x%llx\tcell 0x%llx\tipv4 %s\tnumber of links %d",
-                    node_info_read->hdr.address, node_info_read->hdr.cell_id,
+                    "node address 0x%016llx\tcell 0x%016llx\tipv4 %s\tnumber of links %u",
+                    node_info_read->hdr.address.uint64, node_info_read->hdr.cell_id.uint64,
                     str_ip4, node_info_read->hdr.links_number);
         else
             // set full reply with node param
             dap_string_append_printf(l_string_reply,
-                    "node address 0x%llx\ncell 0x%llx%s\nipv4 %s\nipv6 %s\nlinks %d%s",
-                    node_info_read->hdr.address, node_info_read->hdr.cell_id, aliases_string->str,
+                    "node address 0x%016llx\ncell 0x%016llx%s\nipv4 %s\nipv6 %s\nlinks %u%s",
+                    node_info_read->hdr.address.uint64, node_info_read->hdr.cell_id.uint64, aliases_string->str,
                     str_ip4, str_ip6,
                     node_info_read->hdr.links_number, links_string->str);
         dap_string_free(aliases_string, true);
@@ -539,12 +543,12 @@ static int com_global_db_dump(dap_chain_node_info_t *a_node_info, const char *al
 }
 
 /**
- * Handler of command 'global_db node get'
+ * Handler of command 'global_db node cur_node_get'
  *
  * str_reply[out] for reply
  * return 0 Ok, -1 error
  */
-static int com_global_db_get(char **a_str_reply)
+static int com_global_db_cur_node_get(char **a_str_reply)
 {
     // get cur node addr
     uint64_t l_addr = dap_db_get_cur_node_addr();
@@ -557,12 +561,12 @@ static int com_global_db_get(char **a_str_reply)
 }
 
 /**
- * Handler of command 'global_db node set'
+ * Handler of command 'global_db node cur_node_set'
  *
  * str_reply[out] for reply
  * return 0 Ok, -1 error
  */
-static int com_global_db_set(dap_chain_node_info_t *a_node_info, const char *a_alias_str, char **a_str_reply)
+static int com_global_db_cur_node_set(dap_chain_node_info_t *a_node_info, const char *a_alias_str, char **a_str_reply)
 {
     if(!a_node_info->hdr.address.uint64 && !a_alias_str) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "addr not found");
@@ -575,17 +579,17 @@ static int com_global_db_set(dap_chain_node_info_t *a_node_info, const char *a_a
         return -1;
     }
     // read node
-    dap_chain_node_info_t *l_node_info_read = dap_chain_node_info_read(l_address, a_str_reply);
+    dap_chain_node_info_t *l_node_info_read = dap_chain_node_info_read_and_reply(l_address, a_str_reply);
     if(!l_node_info_read) {
         DAP_DELETE(l_address);
         return -1;
     }
     // set cur node addr
     if(dap_db_set_cur_node_addr(l_node_info_read->hdr.address.uint64)) {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "new address for node has been set");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "new address for current node has been set");
         return 0;
     }
-    dap_chain_node_cli_set_reply_text(a_str_reply, "new address for node has not been set");
+    dap_chain_node_cli_set_reply_text(a_str_reply, "new address for current node has not been set");
     return -1;
 }
 
@@ -595,33 +599,31 @@ static int com_global_db_set(dap_chain_node_info_t *a_node_info, const char *a_a
  * str_reply[out] for reply
  * return 0 Ok, -1 error
  */
-static int com_global_db_set_remote(dap_chain_node_info_t *a_node_info, const char *a_alias_str, char **a_str_reply)
+static int com_global_db_cur_node_set_from_remote(dap_chain_node_info_t *a_node_info, const char *a_alias_str, char **a_str_reply)
 {
     if(!a_node_info->hdr.address.uint64 && !a_alias_str) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "addr not found");
+        DAP_DELETE(a_node_info);
         return -1;
     }
     // find addr by alias or addr_str
     dap_chain_node_addr_t *l_address = com_global_db_get_addr(a_node_info, &a_node_info->hdr.address, a_alias_str);
     if(!l_address) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "alias not found");
+        DAP_DELETE(a_node_info);
         return -1;
     }
     // read node
-    dap_chain_node_info_t *l_node_info_read = dap_chain_node_info_read(l_address, a_str_reply);
+    dap_chain_node_info_t *l_node_info_read = dap_chain_node_info_read_and_reply(l_address, a_str_reply);
     if(!l_node_info_read) {
         DAP_DELETE(l_address);
+        DAP_DELETE(a_node_info);
         return -1;
     }
 
-    // get cur node addr
-    uint64_t l_cur_node_addr = dap_db_get_cur_node_addr(); //0x12345
-    if(!l_cur_node_addr) {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "current node has no address");
-        return -1;
-    }
-    dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_address, a_str_reply);
+    dap_chain_node_info_t *l_node_info = dap_chain_node_info_read_and_reply(l_address, a_str_reply);
     if(!l_node_info) {
+        DAP_DELETE(a_node_info);
         return -1;
     }
     // start connect
@@ -633,7 +635,7 @@ static int com_global_db_set_remote(dap_chain_node_info_t *a_node_info, const ch
     }
     // wait connected
     int timeout_ms = 15000; //15 sec = 15000 ms
-    int res = chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+    int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
     if(res != 1) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "no response from node");
         // clean client struct
@@ -655,7 +657,7 @@ static int com_global_db_set_remote(dap_chain_node_info_t *a_node_info, const ch
 
     // wait for finishing of request
     timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
-    res = chain_node_client_wait(client, NODE_CLIENT_STATE_GET_NODE_ADDR, timeout_ms);
+    res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_GET_NODE_ADDR, timeout_ms);
     DAP_DELETE(l_node_info);
     dap_client_disconnect(client->client);
     dap_chain_node_client_close(client);
@@ -671,15 +673,13 @@ static int com_global_db_set_remote(dap_chain_node_info_t *a_node_info, const ch
             DAP_DELETE(client->recv_data);
         client->recv_data = NULL;
         dap_chain_node_cli_set_reply_text(a_str_reply, "new address for remote node has been set 0x%x", addr);
+
     }
         return 0;
     default:
         dap_chain_node_cli_set_reply_text(a_str_reply, "error");
         return -1;
     }
-
-    dap_chain_node_cli_set_reply_text(a_str_reply, "not implement");
-    return -1;
 }
 
 /**
@@ -687,130 +687,124 @@ static int com_global_db_set_remote(dap_chain_node_info_t *a_node_info, const ch
  *
  * return 0 OK, -1 Err
  */
-int com_global_db(int argc, const char ** argv, char **str_reply)
+int com_global_db(int a_argc, const char ** a_argv, char **a_str_reply)
 {
     enum {
-        CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK, CMD_DUMP, CMD_GET, CMD_SET, CMD_REMOTE_SET
+        CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK, CMD_DUMP, CMD_CUR_NODE_GET, CMD_CUR_NODE_SET, CMD_CUR_NODE_SET_FROM_REMOTE
     };
     //printf("com_global_db\n");
     int arg_index = 1;
     // find 'node' as first parameter only
-    arg_index = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "node", NULL);
-    if(!arg_index || argc < 3) {
-        dap_chain_node_cli_set_reply_text(str_reply, "parameters are not valid");
+    arg_index = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "node", NULL);
+    if(!arg_index || a_argc < 3) {
+        dap_chain_node_cli_set_reply_text(a_str_reply, "parameters are not valid");
         return -1;
     }
     int arg_index_n = ++arg_index;
     // find command (add, delete, etc) as second parameter only
     int cmd_num = CMD_NONE;
-    if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "add", NULL))
+    if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL))
             != 0) {
         cmd_num = CMD_ADD;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "del", NULL))
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL))
             != 0) {
         cmd_num = CMD_DEL;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "link", NULL))
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link", NULL))
             != 0) {
         cmd_num = CMD_LINK;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "dump", NULL))
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "dump", NULL))
             != 0) {
         cmd_num = CMD_DUMP;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "get", NULL))
-            != 0) {
-        cmd_num = CMD_GET;
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_get", NULL)) != 0) {
+        cmd_num = CMD_CUR_NODE_GET;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "set", NULL))
-            != 0) {
-        cmd_num = CMD_SET;
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_set", NULL)) != 0) {
+        cmd_num = CMD_CUR_NODE_SET;
     }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "remote_set",
+    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cur_node_set_from_remote",
     NULL)) != 0) {
-        cmd_num = CMD_REMOTE_SET;
+        cmd_num = CMD_CUR_NODE_SET_FROM_REMOTE;
     }
     if(cmd_num == CMD_NONE) {
-        dap_chain_node_cli_set_reply_text(str_reply, "command %s not recognized", argv[1]);
+        dap_chain_node_cli_set_reply_text(a_str_reply, "command %s not recognized", a_argv[1]);
         return -1;
     }
     //arg_index = arg_index_n; // no need, they are already equal must be
     assert(arg_index == arg_index_n);
     arg_index++;
-    const char *addr_str = NULL, *alias_str = NULL, *cell_str = NULL, *link_str = NULL;
+    const char *l_addr_str = NULL, *alias_str = NULL, *l_cell_str = NULL, *l_link_str = NULL;
     const char *ipv4_str = NULL, *ipv6_str = NULL;
     // find addr, alias
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-addr", &addr_str);
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-alias", &alias_str);
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-cell", &cell_str);
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-ipv4", &ipv4_str);
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-ipv6", &ipv6_str);
-    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-link", &link_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-alias", &alias_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-cell", &l_cell_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ipv4", &ipv4_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ipv6", &ipv6_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-link", &l_link_str);
 
     // struct to write to the global db
-    dap_chain_node_info_t node_info;
-    dap_chain_node_addr_t link;
-    memset(&node_info, 0, sizeof(dap_chain_node_info_t));
-    memset(&link, 0, sizeof(dap_chain_node_addr_t));
-    if(addr_str) {
-        dap_digit_from_string(addr_str, node_info.hdr.address.raw, sizeof(node_info.hdr.address.raw));
+    dap_chain_node_addr_t l_link={0};
+    dap_chain_node_info_t *l_node_info;
+    size_t l_node_info_size = sizeof (l_node_info->hdr)+sizeof(l_link);
+    l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t,l_node_info_size);
+
+    if(l_addr_str) {
+        dap_digit_from_string(l_addr_str, l_node_info->hdr.address.raw, sizeof(l_node_info->hdr.address.raw) );
     }
-    if(cell_str) {
-        dap_digit_from_string(cell_str, node_info.hdr.cell_id.raw, sizeof(node_info.hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE);
+    if(l_cell_str) {
+        dap_digit_from_string(l_cell_str, l_node_info->hdr.cell_id.raw, sizeof(l_node_info->hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE);
     }
-    if(link_str) {
-        dap_digit_from_string(link_str, link.raw, sizeof(link.raw));
+    if(l_link_str) {
+        dap_digit_from_string(l_link_str, l_link.raw, sizeof(l_link.raw));
     }
 
     switch (cmd_num)
     {
     // add new node to global_db
     case CMD_ADD:
-        if(!arg_index || argc < 8) {
-            dap_chain_node_cli_set_reply_text(str_reply, "invalid parameters");
+        if(!arg_index || a_argc < 8) {
+            dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters");
             return -1;
         }
         // handler of command 'global_db node add'
-        return com_global_db_add(&node_info, alias_str, cell_str, ipv4_str, ipv6_str, str_reply);
+        return com_global_db_add(l_node_info, alias_str, l_cell_str, ipv4_str, ipv6_str, a_str_reply);
         //break;
 
     case CMD_DEL:
         // handler of command 'global_db node del'
-        return com_global_db_del(&node_info, alias_str, str_reply);
-        break;
+        return com_global_db_del(l_node_info, alias_str, a_str_reply);
     case CMD_LINK:
-        if(dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "add", NULL))
+        if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL))
             // handler of command 'global_db node link add -addr <node address> -link <node address>'
-            return com_global_db_link(&node_info, "add", alias_str, &link, str_reply);
-        else if(dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "del", NULL))
+            return com_global_db_link(l_node_info, "add", alias_str, &l_link, a_str_reply);
+        else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL))
             // handler of command 'global_db node link del -addr <node address> -link <node address>'
-            return com_global_db_link(&node_info, "del", alias_str, &link, str_reply);
+            return com_global_db_link(l_node_info, "del", alias_str, &l_link, a_str_reply);
         else {
-            dap_chain_node_cli_set_reply_text(str_reply, "command not recognize, supported format:\n"
+            dap_chain_node_cli_set_reply_text(a_str_reply, "command not recognize, supported format:\n"
                     "global_db node link <add|del] [-addr <node address>  | -alias <node alias>] -link <node address>");
+            DAP_DELETE(l_node_info);
             return -1;
         }
-        break;
     case CMD_DUMP:
         // handler of command 'global_db node dump'
-        return com_global_db_dump(&node_info, alias_str, str_reply);
-        break;
-    case CMD_GET:
-        // handler of command 'global_db node get'
-        return com_global_db_get(str_reply);
-        break;
-    case CMD_SET:
-        // handler of command 'global_db node set'
-        return com_global_db_set(&node_info, alias_str, str_reply);
-        break;
-    case CMD_REMOTE_SET:
+        return com_global_db_dump(l_node_info, alias_str, a_str_reply);
+    case CMD_CUR_NODE_GET:
+        // handler of command 'global_db cur_node get'
+        return com_global_db_cur_node_get(a_str_reply);
+    case CMD_CUR_NODE_SET:
+        // handler of command 'global_db cur_node set'
+        return com_global_db_cur_node_set(l_node_info, alias_str, a_str_reply);
+    case CMD_CUR_NODE_SET_FROM_REMOTE:
         // handler of command 'global_db node remote_set'
-        return com_global_db_set_remote(&node_info, alias_str, str_reply);
-        break;
+        return com_global_db_cur_node_set_from_remote(l_node_info, alias_str, a_str_reply);
 
     default:
-        dap_chain_node_cli_set_reply_text(str_reply, "command %s not recognized", argv[1]);
+        dap_chain_node_cli_set_reply_text(a_str_reply, "command %s not recognized", a_argv[1]);
         return -1;
     }
     return -1;
@@ -909,13 +903,14 @@ int com_node(int argc, const char ** argv, char **str_reply)
             }
 
             // get cur node addr
-            uint64_t l_cur_node_addr = dap_db_get_cur_node_addr(); //0x12345
-            if(!l_cur_node_addr) {
-                dap_chain_node_cli_set_reply_text(str_reply, "node has no address");
+            dap_chain_node_addr_t l_cur_node_addr;
+            l_cur_node_addr.uint64 = dap_db_get_cur_node_addr();  //0x12345
+            if(!l_cur_node_addr.uint64) {
+                dap_chain_node_cli_set_reply_text(str_reply, "Current node has no address");
                 return -1;
             }
 
-            dap_chain_node_info_t *node_info = dap_chain_node_info_read(&address, str_reply);
+            dap_chain_node_info_t *node_info = dap_chain_node_info_read_and_reply(&address, str_reply);
             if(!node_info) {
                 return -1;
             }
@@ -928,7 +923,7 @@ int com_node(int argc, const char ** argv, char **str_reply)
             }
             // wait connected
             int timeout_ms = 15000; //15 sec = 15000 ms
-            int res = chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+            int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
             if(res != 1) {
                 dap_chain_node_cli_set_reply_text(str_reply, "no response from node");
                 // clean client struct
@@ -942,7 +937,7 @@ int com_node(int argc, const char ** argv, char **str_reply)
             // Get last timestamp in log
             time_t l_timestamp_start = dap_db_log_get_last_timestamp();
             size_t l_data_send_len = 0;
-            uint8_t *l_data_send = dap_stream_ch_chain_net_make_packet(l_cur_node_addr, node_info->hdr.address.uint64,
+            uint8_t *l_data_send = dap_stream_ch_chain_net_make_packet(l_cur_node_addr.uint64, node_info->hdr.address.uint64,
                     l_timestamp_start, NULL, 0, &l_data_send_len);
 
             uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for global_db sync
@@ -960,7 +955,7 @@ int com_node(int argc, const char ** argv, char **str_reply)
             // wait for finishing of request
             timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
             // TODO add progress info to console
-            res = chain_node_client_wait(client, NODE_CLIENT_STATE_END, timeout_ms);
+            res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_END, timeout_ms);
             DAP_DELETE(node_info);
             dap_client_disconnect(client->client);
             dap_chain_node_client_close(client);
@@ -997,7 +992,7 @@ int com_node(int argc, const char ** argv, char **str_reply)
                 return -1;
             }
 
-            dap_chain_node_info_t *node_info = dap_chain_node_info_read(&address, str_reply);
+            dap_chain_node_info_t *node_info = dap_chain_node_info_read_and_reply(&address, str_reply);
             if(!node_info)
                 return -1;
             int timeout_ms = 10000; //10 sec = 10000 ms
@@ -1009,7 +1004,7 @@ int com_node(int argc, const char ** argv, char **str_reply)
                 return -1;
             }
             // wait handshake
-            int res = chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+            int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
             if(res != 1) {
                 dap_chain_node_cli_set_reply_text(str_reply, "no response from node");
                 // clean client struct
@@ -1651,7 +1646,6 @@ int com_mempool_list(int argc, const char ** argv, char ** a_str_reply)
     dap_chain_net_t * l_net = NULL;
 
     if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) != 0){
-        dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Need both -net <network name> and -chain <chain name> params\n");
         return -1;
     }
 
@@ -2185,8 +2179,8 @@ int com_tx_cond_create(int argc, const char ** argv, char **str_reply)
     const dap_chain_addr_t *addr_cond = dap_chain_wallet_get_addr(l_wallet_cond);
 
     dap_chain_net_srv_abstract_t l_cond;
-    dap_chain_net_srv_abstract_set(&l_cond, SERV_CLASS_PERMANENT, SERV_ID_VPN, l_value, SERV_UNIT_MB,
-            "test vpn service");
+//    dap_chain_net_srv_abstract_set(&l_cond, SERV_CLASS_PERMANENT, SERV_ID_VPN, l_value, SERV_UNIT_MB,
+//            "test vpn service");
     int res = dap_chain_mempool_tx_create_cond(l_key, l_key_cond, addr_from,
             addr_cond,
             NULL, l_token_ticker, l_value, 0, (const void*) &l_cond, sizeof(dap_chain_net_srv_abstract_t));
@@ -2323,7 +2317,7 @@ int com_print_log(int argc, const char ** argv, char **str_reply)
     l_ts_after = (l_str_ts_after) ? strtoll(l_str_ts_after, 0, 10) : -1;
     l_limit = (l_str_limit) ? strtol(l_str_limit, 0, 10) : -1;
 
-    if(l_ts_after<0 || !l_str_ts_after) {
+    if(l_ts_after < 0 || !l_str_ts_after) {
         dap_chain_node_cli_set_reply_text(str_reply, "requires valid parameter 'l_ts_after'");
         return -1;
     }
@@ -2332,8 +2326,14 @@ int com_print_log(int argc, const char ** argv, char **str_reply)
         return -1;
     }
 
-    char *l_str_ret = NULL;
+    // get logs from list
+    char *l_str_ret = log_get_item(l_ts_after, l_limit);
+    if(!l_str_ret) {
+        dap_chain_node_cli_set_reply_text(str_reply, "no logs");
+        return -1;
+    }
     dap_chain_node_cli_set_reply_text(str_reply, l_str_ret);
-    return -1;
+    DAP_DELETE(l_str_ret);
+    return 0;
 }
 
-- 
GitLab