diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index cd8edd3ad001012d941598cfccfc3a22b9b8cb99..c3993601de00e817056771c2d64245acc110f486 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -87,6 +87,9 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "global_db write -group <group_name> -key <key_name> -value <value>" "global_db read -group <group_name> -key <key_name>" "global_db delete -group <group_name> -key <key_name>" + "global_db drop_table -group <group_name>\n" + "global_db get_keys -group <group name>" + // "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n" ); dap_cli_server_cmd_add("mempool", com_signer, "Sign operations", diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index a62447ea254df379062ec2efacf50079ea6c1df8..93cd92c2fc65bd5b9dfe2be9553d786b64c571cf 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -730,7 +730,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) { enum { - CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ, CMD_DELETE + CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ, CMD_DELETE, CMD_DROP, CMD_GET_KEYS }; int arg_index = 1; int cmd_name = CMD_NONE; @@ -747,6 +747,11 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) cmd_name = CMD_READ; else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "delete", NULL)) cmd_name = CMD_DELETE; + else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "drop_table", NULL)) + cmd_name = CMD_DROP; + else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "get_keys", NULL)) + cmd_name = CMD_GET_KEYS; + switch (cmd_name) { case CMD_NAME_CELL: { @@ -930,100 +935,164 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) return l_ret; } case CMD_WRITE: - { - const char *l_group_str = NULL; - const char *l_key_str = NULL; - const char *l_value_str = NULL; + { + const char *l_group_str = NULL; + const char *l_key_str = NULL; + const char *l_value_str = NULL; - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); - if(!l_group_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); - return -120; - } + if(!l_group_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + return -120; + } - if(!l_key_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); - return -121; - } + if(!l_key_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); + return -121; + } - if(!l_value_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'value' to be valid", a_argv[0]); - return -122; - } + if(!l_value_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'value' to be valid", a_argv[0]); + return -122; + } - if (dap_global_db_set(l_group_str, l_key_str, l_value_str, strlen(l_value_str), false, NULL, NULL)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Data has been successfully written to the database"); - return 0; - } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Data writing is failed"); - return -124; - } + if (!dap_global_db_set_sync(l_group_str, l_key_str, l_value_str, strlen(l_value_str) +1 , false)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Data has been successfully written to the database"); + return 0; + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Data writing is failed"); + return -124; + } + } + case CMD_READ: + { + const char *l_group_str = NULL; + const char *l_key_str = NULL; + + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + + if(!l_group_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + return -120; + } + + if(!l_key_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); + return -122; } - case CMD_READ: + + size_t l_out_len = 0; + uint8_t *l_value_out = dap_global_db_get_sync(l_group_str, l_key_str, &l_out_len, NULL, NULL); + + if (!l_value_out || !l_out_len) { - const char *l_group_str = NULL; - const char *l_key_str = NULL; + dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s not found", l_key_str, l_group_str); + return -121; + } - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Group %s, key %s, data:\n %s", l_group_str, l_key_str, (char*)l_value_out); + return 0; + } + case CMD_DELETE: + { + const char *l_group_str = NULL; + const char *l_key_str = NULL; - if(!l_group_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); - return -120; - } + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); - if(!l_key_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); - return -122; - } + if(!l_group_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + return -120; + } - size_t l_out_len = 0; - uint8_t *l_value_out = dap_global_db_get_sync(l_group_str, l_key_str, &l_out_len, NULL, NULL); + if(!l_key_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "No key provided, entire table %s will be altered", l_group_str); + size_t l_objs_count = 0; + dap_global_db_obj_t* l_obj = dap_global_db_get_all_sync(l_group_str, &l_objs_count); - if (!l_value_out || !l_out_len) + if (!l_obj || !l_objs_count) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s not found", l_key_str, l_group_str); - return -121; + dap_cli_server_cmd_set_reply_text(a_str_reply, "No data in group %s.", l_group_str); + return -124; } + size_t i, j = 0; + for (i = 0; i < l_objs_count; ++i) { + if (!l_obj[i].key) + continue; + if (!dap_global_db_del_sync(l_group_str, l_obj[i].key)) { + ++j; + } + } + dap_global_db_objs_delete(l_obj, l_objs_count); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Removed %lu of %lu records in table %s", j, i, l_group_str); + return 0; + } - dap_cli_server_cmd_set_reply_text(a_str_reply, "Group %s, key %s, data:\n %s", l_group_str, l_key_str, (char*)l_value_out); + if (dap_global_db_del(l_group_str, l_key_str, NULL, NULL)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s was deleted successfuly", l_key_str, l_group_str); return 0; + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s deleting failed", l_group_str, l_key_str); + return -122; } - case CMD_DELETE: - { - const char *l_group_str = NULL; - const char *l_key_str = NULL; + } + case CMD_DROP: + { + const char *l_group_str = NULL; + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + if(!l_group_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + return -120; + } - if(!l_group_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); - return -120; - } + if (!dap_global_db_del_sync(l_group_str, NULL)) + { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Dropped table %s", l_group_str); + return 0; + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Failed to drop table %s", l_group_str); + return -122; + } + } + case CMD_GET_KEYS: + { + const char *l_group_str = NULL; + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - if(!l_key_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); - return -121; - } + if(!l_group_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + return -120; + } - if (dap_global_db_del(l_group_str, l_key_str, NULL, NULL)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s was deleted successfuly", l_key_str, l_group_str); - return 0; - } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s deleting failed", l_group_str, l_key_str); - return -122; - } - } + size_t l_objs_count = 0; + dap_global_db_obj_t* l_obj = dap_global_db_get_all_sync(l_group_str, &l_objs_count); + + if (!l_obj || !l_objs_count) + { + dap_cli_server_cmd_set_reply_text(a_str_reply, "No data in group %s.", l_group_str); + return -124; + } + + dap_string_t *l_ret_str = dap_string_new(NULL); + for(size_t i = 0; i < l_objs_count; i++){ + dap_string_append_printf(l_ret_str, "%s\n", l_obj[i].key); + } + + dap_cli_server_cmd_set_reply_text(a_str_reply, "Keys list for group %s:\n%s\n", l_group_str, l_ret_str->str); + dap_string_free(l_ret_str, true); + return 0; + } default: dap_cli_server_cmd_set_reply_text(a_str_reply, "parameters are not valid"); return -1; } - return -555; } /** diff --git a/modules/net/srv/dap_chain_net_srv_stream_session.c b/modules/net/srv/dap_chain_net_srv_stream_session.c index 6df72f5346370ae52134c607fb9f8dd2ce756a84..5a5d8e99e744fbc8b582b94d34c73913bc89a350 100644 --- a/modules/net/srv/dap_chain_net_srv_stream_session.c +++ b/modules/net/srv/dap_chain_net_srv_stream_session.c @@ -96,6 +96,9 @@ dap_chain_net_srv_usage_t* dap_chain_net_srv_usage_add (dap_chain_net_srv_stream */ void dap_chain_net_srv_usage_delete (dap_chain_net_srv_stream_session_t * a_srv_session) { + if (!a_srv_session || !a_srv_session->usage_active) + return; + if ( a_srv_session->usage_active->receipt ) DAP_DELETE( a_srv_session->usage_active->receipt ); if ( a_srv_session->usage_active->receipt_next )