diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c index d5f78a6e4745a9723d5e38c0489be930492cd498..c3c16badbc50440aea456f5b845711ffcfae61d6 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -196,7 +196,7 @@ pcdb_instance dap_cdb_init_group(const char *a_group, int a_flags) { } memset(l_cdb_path, '\0', sizeof(l_cdb_path)); dap_snprintf(l_cdb_path, sizeof(l_cdb_path), "%s/%s", s_cdb_path, a_group); - cdb_options l_opts = { 4096, 128, 1024 }; + cdb_options l_opts = { 100000, 256, 1024 }; if (cdb_option(l_cdb_i->cdb, l_opts.hsize, l_opts.pcacheMB, l_opts.rcacheMB) != CDB_SUCCESS) { log_it(L_ERROR, "Options are inacceptable: \"%s\"", cdb_errmsg(cdb_errno(l_cdb_i->cdb))); goto ERR; diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 62bc323d1f872f89689ec9d5a962366d1094b26d..8a9038d5185936e08f21e868d9a3816a01391278 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -1122,7 +1122,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // Export GDB to JSON dap_chain_node_cli_cmd_item_create("gdb_export", cmd_gdb_export, "Export gdb to JSON", - "gdb_export filename <filename without extension>"); + "gdb_export filename <filename without extension> [-groups <group names list>]"); //Import GDB from JSON dap_chain_node_cli_cmd_item_create("gdb_import", cmd_gdb_import, "Import gdb from JSON", diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 468473fb7de5bea0448aee14e27bf8047a8b2903..f466f0458cb553c24bc34bdadc81bea59d27fdca 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -78,6 +78,7 @@ #include "dap_chain_node_cli_cmd_tx.h" #include "dap_chain_node_ping.h" #include "dap_chain_net_srv.h" + #ifndef _WIN32 #include "dap_chain_net_news.h" #endif @@ -5037,19 +5038,35 @@ int cmd_gdb_export(int argc, char ** argv, char ** a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Can't open db directory"); return -1; } - char l_path[strlen(l_db_path) + strlen(l_filename) + 12]; + char l_path[MIN(strlen(l_db_path) + strlen(l_filename) + 12, MAX_PATH)]; memset(l_path, '\0', sizeof(l_path)); dap_snprintf(l_path, sizeof(l_path), "%s/%s.json", l_db_path, l_filename); + const char *l_groups_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-groups", &l_groups_str); + char *l_group_str = NULL, *l_ctx = NULL; + dap_list_t *l_parsed_groups_list = NULL; + if (l_groups_str) { + char *l_tmp_str = dap_strdup(l_groups_str); + l_group_str = strtok_r(l_tmp_str, ",", &l_ctx); + for (; l_group_str; l_group_str = strtok_r(NULL, ",", &l_ctx)) { + l_parsed_groups_list = dap_list_prepend(l_parsed_groups_list, dap_strdup(l_group_str)); + } + DAP_DEL_Z(l_tmp_str); + } struct json_object *l_json = json_object_new_array(); - dap_list_t *l_groups_list = dap_chain_global_db_driver_get_groups_by_mask("*"); + dap_list_t *l_groups_list = l_parsed_groups_list + ? l_parsed_groups_list + : dap_chain_global_db_driver_get_groups_by_mask("*"); for (dap_list_t *l_list = l_groups_list; l_list; l_list = dap_list_next(l_list)) { size_t l_store_obj_count = 0; char *l_group_name = (char *)l_list->data; pdap_store_obj_t l_store_obj = dap_global_db_get_all_raw_sync(l_group_name,0, &l_store_obj_count); - log_it(L_INFO, "Exporting group %s, number of records: %zu", l_group_name, l_store_obj_count); if (!l_store_obj_count) { + log_it(L_INFO, "Group %s is empty or not found", l_group_name); continue; + } else { + log_it(L_INFO, "Exporting group %s, number of records: %zu", l_group_name, l_store_obj_count); } struct json_object *l_json_group = json_object_new_array(); @@ -5146,7 +5163,8 @@ int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply) l_group_store[j].id = (uint64_t)json_object_get_int64(l_id); l_group_store[j].key = dap_strdup(json_object_get_string(l_key)); l_group_store[j].group = dap_strdup(l_group_name); - l_group_store[j].timestamp = json_object_get_int64(l_ts); + dap_nanotime_t l_temp = json_object_get_int64(l_ts); + l_group_store[j].timestamp = l_temp >> 32 ? l_temp : l_temp << 32; // possibly legacy record l_group_store[j].value_len = (uint64_t)json_object_get_int64(l_value_len); l_group_store[j].type = 'a'; const char *l_value_str = json_object_get_string(l_value); @@ -5156,6 +5174,8 @@ int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply) } if (dap_chain_global_db_driver_apply(l_group_store, l_records_count)) { log_it(L_CRITICAL, "An error occured on importing group %s...", l_group_name); + } else { + log_it(L_INFO, "Imported %llu records of group %s", l_records_count, l_group_name); } //dap_store_obj_free(l_group_store, l_records_count); } diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 08999930ce338c52d8c3b5a32c3ef6e2ec37c4f0..c4ef7312273c7f92e5eeac332f5ac9f26f67de6b 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -319,9 +319,10 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( l_order->price_unit.uint32 = a_price_unit.uint32; if ( a_price_ticker) - strncpy(l_order->price_ticker, a_price_ticker,sizeof(l_order->price_ticker)-1); + strncpy(l_order->price_ticker, a_price_ticker, DAP_CHAIN_TICKER_SIZE_MAX); dap_sign_t *l_sign = dap_sign_create(a_key, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size, 0); if (!l_sign) { + DAP_DELETE(l_order); return NULL; } size_t l_sign_size = dap_sign_get_size(l_sign); // sign data