diff --git a/dap-sdk/core/src/dap_config.c b/dap-sdk/core/src/dap_config.c index f848b34867036fd722f2ed411a47f52c998983cc..fea4cf8e0dadae744a13b357e12ee3cd36c5e641 100755 --- a/dap-sdk/core/src/dap_config.c +++ b/dap-sdk/core/src/dap_config.c @@ -595,7 +595,16 @@ const char * dap_config_get_item_str_default(dap_config_t * a_config, const char */ bool dap_config_get_item_bool(dap_config_t * a_config, const char * a_section_path, const char * a_item_name) { - return strcmp(dap_config_get_item_str(a_config,a_section_path,a_item_name),"true") == 0; +char *cp; + + if ( !(cp = dap_config_get_item_str(a_config, a_section_path, a_item_name)) ) + return false; + +#ifdef WIN32 + return !strnicmp (cp, "true", 4); +#else + return !strncasecmp (cp, "true", 4); /* 0 == True */ +#endif } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 4eccc38e970fcb3c2099a915ca887ad6e51850c8..b52e5a9669813331319200a916e9152e926908db 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -252,7 +252,7 @@ void dap_chain_ledger_deinit() /** * @brief dap_chain_ledger_handle_new * Create empty dap_ledger_t structure - * @return dap_ledger_t* + * @return dap_ledger_t* */ static dap_ledger_t * dap_chain_ledger_handle_new(void) { @@ -272,7 +272,7 @@ static dap_ledger_t * dap_chain_ledger_handle_new(void) /** * @brief dap_chain_ledger_handle_free * Remove dap_ledger_t structure - * @param a_ledger + * @param a_ledger */ void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger) { @@ -374,16 +374,15 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t * pthread_rwlock_wrlock(&PVT(a_ledger)->tokens_rwlock); HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item); pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); + // Add it to cache - dap_chain_datum_token_t *l_token_cache = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, a_token_size); - memcpy(l_token_cache, a_token, a_token_size); char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TOKENS_STR); - if (!dap_chain_global_db_gr_set(dap_strdup(a_token->ticker), l_token_cache, a_token_size, l_gdb_group)) { + if (!dap_chain_global_db_gr_set( a_token->ticker, a_token, a_token_size, l_gdb_group)) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_token_cache); } DAP_DELETE(l_gdb_group); + l_token_item->type = a_token->type; switch(a_token->type){ case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: {// 256 @@ -453,12 +452,12 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t * /** * @brief s_token_tsd_parse - * - * @param a_ledger - * @param a_token_item - * @param a_token - * @param a_token_size - * @return int + * + * @param a_ledger + * @param a_token_item + * @param a_token + * @param a_token_size + * @return int */ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_item_t *a_token_item , dap_chain_datum_token_t * a_token, size_t a_token_size) { @@ -492,7 +491,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite // set total supply case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256:{ // 256 - a_token_item->total_supply = dap_tsd_get_scalar(l_tsd,uint256_t); + a_token_item->total_supply = dap_tsd_get_scalar(l_tsd,uint256_t); }break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY:{ // 128 @@ -927,7 +926,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: l_type_str = "SIMPLE"; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: l_type_str = "PRIVATE_DECL"; break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 @@ -958,7 +957,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) * @param a_ledger */ static void s_treshold_emissions_proc(dap_ledger_t * a_ledger) -{ +{ bool l_success; do { l_success = false; @@ -979,7 +978,7 @@ static void s_treshold_emissions_proc(dap_ledger_t * a_ledger) pthread_rwlock_rdlock(&PVT(a_ledger)->treshold_emissions_rwlock); } pthread_rwlock_unlock(&PVT(a_ledger)->treshold_emissions_rwlock); - } while (l_success); + } while (l_success); } /** @@ -987,7 +986,7 @@ static void s_treshold_emissions_proc(dap_ledger_t * a_ledger) * @param a_ledger */ static void s_treshold_txs_proc( dap_ledger_t *a_ledger) -{ +{ bool l_success; dap_ledger_private_t * l_ledger_pvt = PVT(a_ledger); pthread_rwlock_rdlock(&l_ledger_pvt->treshold_txs_rwlock); @@ -1107,7 +1106,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) for (size_t i = 0; i < l_objs_count; i++) { dap_ledger_wallet_balance_t *l_balance_item = DAP_NEW_Z(dap_ledger_wallet_balance_t); size_t l_v0_size = sizeof(uint128_t); // for old data - + l_balance_item->key = DAP_NEW_Z_SIZE(char, strlen(l_objs[i].key) + 1); strcpy(l_balance_item->key, l_objs[i].key); char *l_ptr = strchr(l_balance_item->key, ' '); @@ -1127,7 +1126,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) } /** - * @brief + * @brief * create ledger for specific net * load ledger cache * @param a_check_flags checking flags @@ -1135,7 +1134,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) * DAP_CHAIN_LEDGER_CHECK_CELLS_DS * DAP_CHAIN_LEDGER_CHECK_CELLS_DS * @param a_net_name char * network name, for example "kelvin-testnet" - * @return dap_ledger_t* + * @return dap_ledger_t* */ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name) { @@ -2188,34 +2187,41 @@ int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * static int s_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_balance) { char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR); - uint256_t *l_balance_value = DAP_NEW_Z(uint256_t); - *l_balance_value = a_balance->balance; - if (!dap_chain_global_db_gr_set(dap_strdup(a_balance->key), l_balance_value, sizeof(uint256_t), l_gdb_group)) { + + if (!dap_chain_global_db_gr_set(a_balance->key, &a_balance->balance, sizeof(uint256_t), l_gdb_group)) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_balance_value); return -1; } + DAP_DELETE(l_gdb_group); return 0; } static int s_tx_cache_update(dap_ledger_t *a_ledger, dap_chain_ledger_tx_item_t *a_item) { - size_t l_tx_size = dap_chain_datum_tx_get_size(a_item->tx); - uint8_t *l_tx_cache = DAP_NEW_Z_SIZE(uint8_t, l_tx_size + sizeof(a_item->cache_data)); + int rc; + + size_t l_tx_size = dap_chain_datum_tx_get_size(a_item->tx), + l_tx_cache_sz = l_tx_size + sizeof(a_item->cache_data); + + uint8_t *l_tx_cache = DAP_NEW_Z_SIZE(uint8_t, l_tx_cache_sz); memcpy(l_tx_cache, &a_item->cache_data, sizeof(a_item->cache_data)); memcpy(l_tx_cache + sizeof(a_item->cache_data), a_item->tx, l_tx_size); + char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR); char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(&a_item->tx_hash_fast); - if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_tx_cache, l_tx_size + sizeof(a_item->cache_data), l_gdb_group)) { + + if ( !(rc = dap_chain_global_db_gr_set(l_tx_hash_str, l_tx_cache, l_tx_cache_sz, l_gdb_group)) ) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_tx_cache); - return -1; } + + DAP_DELETE(l_tx_hash_str); + DAP_DELETE(l_tx_cache); DAP_DELETE(l_gdb_group); - return 0; + + return (rc == true) ? 0 : -1; } /** @@ -2306,7 +2312,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t l_type = *(uint8_t *)l_item_in; dap_chain_ledger_tx_item_t *l_prev_item_out = bound_item->item_out; dap_chain_tx_item_type_t l_out_type = *(uint8_t *)l_prev_item_out; - + if ( *l_prev_item_out->cache_data.token_ticker ) l_ticker_trl = dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_ticker); else if ( l_out_type == TX_ITEM_TYPE_OUT_EXT) // 256 @@ -2565,11 +2571,12 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, memcpy(l_tx_cache, &l_item_tmp->cache_data, sizeof(l_item_tmp->cache_data)); memcpy(l_tx_cache + sizeof(l_item_tmp->cache_data), a_tx, l_tx_size); char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR); - if (!dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_tx_cache, l_tx_size + sizeof(l_item_tmp->cache_data), l_gdb_group)) { + if (!dap_chain_global_db_gr_set( l_tx_hash_str, l_tx_cache, l_tx_size + sizeof(l_item_tmp->cache_data), l_gdb_group)) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_tx_cache); } + + DAP_DELETE(l_tx_cache); DAP_DELETE(l_gdb_group); if (!a_from_threshold) s_treshold_txs_proc(a_ledger); // TODO process thresholds only for non consensus chains @@ -2636,7 +2643,9 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ if(l_item_tmp != NULL) { // Remove it from cache char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR); - dap_chain_global_db_gr_del(dap_chain_hash_fast_to_str_new(a_tx_hash), l_gdb_group); + char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash); + dap_chain_global_db_gr_del( l_tx_hash_str, l_gdb_group); + DAP_DELETE(l_tx_hash_str); DAP_DELETE(l_gdb_group); l_ret = 1; dap_chain_ledger_tx_spent_item_t *l_item_used; @@ -2646,17 +2655,16 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ memcpy(&l_item_used->tx_hash_fast, a_tx_hash, sizeof(dap_chain_hash_fast_t)); strncpy(l_item_used->token_ticker, l_item_tmp->cache_data.token_ticker, DAP_CHAIN_TICKER_SIZE_MAX); HASH_ADD(hh, l_ledger_priv->spent_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_used); + // Add it to cache - char *l_cache_data = DAP_NEW_Z_SIZE(char, DAP_CHAIN_TICKER_SIZE_MAX); - strncpy(l_cache_data, l_item_used->token_ticker, DAP_CHAIN_TICKER_SIZE_MAX); l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR); char *l_tx_hash_str = dap_hash_fast_to_str_new(a_tx_hash); - if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_cache_data, -1, l_gdb_group)) { + if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_item_used->token_ticker, -1, l_gdb_group)) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_cache_data); - DAP_DELETE(l_tx_hash_str); } + + DAP_DELETE(l_tx_hash_str); DAP_DELETE(l_gdb_group); } // del struct for hash @@ -2684,7 +2692,7 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) // delete transactions dap_chain_ledger_tx_item_t *l_item_current, *l_item_tmp; char *l_gdb_group; - HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) { + HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) { HASH_DEL(l_ledger_priv->ledger_items, l_item_current); DAP_DELETE(l_item_current->tx); DAP_DELETE(l_item_current); @@ -3235,14 +3243,14 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c if (!l_out->header.value || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { continue; } - l_value = GET_256_FROM_64(l_out->header.value); + l_value = GET_256_FROM_64(l_out->header.value); } break; case TX_ITEM_TYPE_OUT_256: { dap_chain_256_tx_out_t *l_out = (dap_chain_256_tx_out_t *)l_list_tmp->data; if ( IS_ZERO_256(l_out->header.value) || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { continue; } - l_value = l_out->header.value; + l_value = l_out->header.value; } break; case TX_ITEM_TYPE_OUT_EXT: { dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 1feaa3c4b5d7bbde59fc2d286154661dc3dd8917..c14c975de1e166da78f188a1723b8f489c438f9b 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -428,7 +428,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); } break; - // only for server + // only for server case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST:{ if (l_ch_pkt->hdr.size < sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t) ){ log_it( L_WARNING, "Wrong request size, less than minimum"); @@ -586,9 +586,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) // Store receipt if any problems with transactions dap_chain_hash_fast_t l_receipt_hash={0}; dap_hash_fast(l_receipt,l_receipt_size,&l_receipt_hash); + char * l_receipt_hash_str = dap_chain_hash_fast_to_str_new(&l_receipt_hash); dap_chain_global_db_gr_set( l_receipt_hash_str,l_receipt,l_receipt_size,"local.receipts"); - l_receipt_hash_str = NULL; // To prevent usage of this pointer when it will be free by GDB processor + DAP_DELETE(l_receipt_hash_str); + size_t l_success_size; dap_chain_hash_fast_t *l_tx_in_hash = NULL; if (!l_usage->is_grace) { diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index a6414b71d0039722ca3d84feb658478c3c68a6b5..c97c38f0a56f1a5c8ad702d2bb7bb24093115dd8 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -131,7 +131,7 @@ int dap_stream_ch_chain_init() s_debug_more = dap_config_get_item_bool_default(g_config,"stream_ch_chain","debug_more",false); s_update_pack_size = dap_config_get_item_int16_default(g_config,"stream_ch_chain","update_pack_size",100); s_list_ban_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "ban_list_sync_groups", &s_size_ban_groups); - s_list_white_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "white_list_sync_groups", &s_size_white_groups); + s_list_white_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "white_list_sync_groups", &s_size_white_groups); return 0; } @@ -337,7 +337,7 @@ static void s_sync_out_gdb_first_worker_callback(dap_worker_t *a_worker, void *a dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain->request_hdr.net_id); // Add it to outgoing list - if (l_ch_chain->request_db_log == NULL) l_ch_chain->request_db_log = l_sync_request->gdb.db_log; + if (l_ch_chain->request_db_log == NULL) l_ch_chain->request_db_log = l_sync_request->gdb.db_log; l_ch_chain->state = CHAIN_STATE_SYNC_GLOBAL_DB; dap_chain_node_addr_t l_node_addr = { 0 }; l_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); @@ -395,13 +395,13 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar { struct sync_request *l_sync_request = (struct sync_request *)a_arg; dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id); - dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid); - if (l_ch == NULL) { - log_it(L_INFO, "Client disconnected before we sent the reply"); - s_sync_request_delete(l_sync_request); + dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid); + if (l_ch == NULL) { + log_it(L_INFO, "Client disconnected before we sent the reply"); + s_sync_request_delete(l_sync_request); return true; - } - dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); + } + dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); int l_flags = 0; if (dap_chain_net_get_add_gdb_group(l_net, l_sync_request->request.node_addr)) @@ -409,10 +409,10 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; dap_db_log_list_t *l_db_log = NULL; - if (l_ch_chain->request_db_log == NULL) { - l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); - l_ch_chain->request_db_log = l_db_log; - } + if (l_ch_chain->request_db_log == NULL) { + l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = l_db_log; + } if(l_db_log) { if (s_debug_more) @@ -464,10 +464,10 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; dap_db_log_list_t *l_db_log = NULL; - if (l_ch_chain->request_db_log == NULL) { - l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); - l_ch_chain->request_db_log = l_db_log; - } + if (l_ch_chain->request_db_log == NULL) { + l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = l_db_log; + } l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB; l_sync_request->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_update_gdb_start_worker_callback, l_sync_request); @@ -665,7 +665,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) uint64_t l_last_id = l_store_obj->id; char *l_last_group = l_store_obj->group; - char l_last_type = l_store_obj->type; + int l_last_type = l_store_obj->type; bool l_group_changed = false; @@ -700,7 +700,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) (l_group_changed || i == l_data_obj_count - 1)) { struct sync_request *l_sync_req_tsd = DAP_DUP(l_sync_request); l_sync_req_tsd->request.id_end = l_last_id; - l_sync_req_tsd->gdb.sync_group = l_obj->type == 'a' ? dap_strdup(l_last_group) : + l_sync_req_tsd->gdb.sync_group = l_obj->type == DAP_DB$K_OPTYPE_ADD ? dap_strdup(l_last_group) : dap_strdup_printf("%s.del", l_last_group); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_gdb_sync_tsd_worker_callback, l_sync_req_tsd); @@ -810,11 +810,11 @@ static bool s_chain_timer_callback(void *a_arg) if (!l_ch_chain->was_active) { if (l_ch_chain->state != CHAIN_STATE_IDLE) { dap_stream_ch_chain_go_idle(l_ch_chain); - } + } if (l_ch_chain->callback_notify_packet_out) l_ch_chain->callback_notify_packet_out(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT, NULL, 0, l_ch_chain->callback_notify_arg); - if (l_ch_chain->request_db_log) s_free_log_list_gdb(l_ch_chain); + if (l_ch_chain->request_db_log) s_free_log_list_gdb(l_ch_chain); DAP_DELETE(a_arg); l_ch_chain->activity_timer = NULL; return false; @@ -1441,7 +1441,7 @@ static void s_free_log_list_gdb ( dap_stream_ch_chain_t * a_ch_chain) } a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL; #endif - a_ch_chain->remote_gdbs = NULL; + a_ch_chain->remote_gdbs = NULL; } /** * @brief dap_stream_ch_chain_go_idle diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 236f44c1fb184092f85b0c14c2d57f02b4dda0b6..2d457e059cc608c4676fe3bff9393266aa382aeb 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -86,8 +86,8 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_arg_t * a_callback_arg); static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_size); -static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, - size_t a_event_size, char * a_event_hash_hex_str, +static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, + size_t a_event_size, char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); @@ -176,23 +176,32 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) // event hash may be in hex or base58 format char *l_event_hash_hex_str; char *l_event_hash_base58_str; + if(!dap_strcmp(l_hash_out_type, "hex")) { l_event_hash_hex_str = dap_strdup(l_event_hash_str); l_event_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_hash_str); + if (!l_event_hash_base58_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid hex hash format"); + DAP_DELETE(l_event_hash_hex_str); return -5; } } else { l_event_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_event_hash_str); l_event_hash_base58_str = dap_strdup(l_event_hash_str); + if (!l_event_hash_hex_str) { + DAP_DELETE(l_event_hash_base58_str); dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid base58 hash format"); } + + DAP_DELETE(l_event_hash_hex_str); + DAP_DELETE(l_event_hash_base58_str); return -6; } + if ( l_event_cmd_str != NULL ){ if (l_poa_pvt->events_sign_cert ) ret = -1; @@ -201,6 +210,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) size_t l_event_size = 0; dap_chain_cs_dag_event_t * l_event; dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg; + if ( (l_event = dap_chain_cs_dag_event_gdb_get( l_event_hash_hex_str, &l_event_size, l_gdb_group_events, &l_event_round_cfg )) == NULL ){ dap_chain_node_cli_set_reply_text(a_str_reply, @@ -209,7 +219,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) ret = -30; }else { size_t l_event_size_new = 0; - dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, + dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, &l_event_size_new, l_chain_net, l_poa_pvt->events_sign_cert->enc_key); if ( l_event_new ) { @@ -225,7 +235,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event_new, l_event_size_new, l_gdb_group_events, &l_event_round_cfg) ){ - if ( !dap_chain_global_db_gr_del(dap_strdup(l_event_hash_hex_str), l_gdb_group_events) ) { // Delete old event + if ( !dap_chain_global_db_gr_del( l_event_hash_hex_str, l_gdb_group_events) ) { // Delete old event ret = 1; dap_chain_node_cli_set_reply_text(a_str_reply, "Added new sign with cert \"%s\", event %s placed back in round.new\n" "WARNING! Old event %s with same datum is still in round.new, produced DUP!\n", @@ -269,7 +279,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Can't sign event in round.new\n", l_event_hash_str); - ret=-1; + ret=-1; } //DAP_DELETE(l_event_new); } @@ -282,6 +292,10 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Command dag_poa requires subcommand 'event'"); } + + DAP_DELETE(l_event_hash_hex_str); + DAP_DELETE(l_event_hash_base58_str); + return ret; } @@ -365,7 +379,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev // size_t l_event_size = ((dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value)->event_size; dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event; - if ( memcmp(&l_event_round_cfg.first_event_hash, + if ( memcmp(&l_event_round_cfg.first_event_hash, &l_event_round_item->cfg.first_event_hash, sizeof(dap_chain_hash_fast_t)) == 0 ) { event_clean_dup_items_t * l_item = DAP_NEW_Z(event_clean_dup_items_t); l_item->signs_count = l_event->header.signs_count; @@ -384,8 +398,8 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev event_clean_dup_items_t *l_clean_item=NULL, *l_clean_tmp=NULL; HASH_ITER(hh, s_event_clean_dup_items, l_clean_item, l_clean_tmp) { if ( l_clean_item->signs_count < l_max_signs_count ) { - // delete dup by min signatures - dap_chain_global_db_gr_del(dap_strdup(l_clean_item->hash_str), l_gdb_group_events); + // delete dup by min signatures + dap_chain_global_db_gr_del( l_clean_item->hash_str, l_gdb_group_events); HASH_DEL(s_event_clean_dup_items, l_clean_item); DAP_DELETE(l_clean_item); } else if ( l_clean_item->ts_update > l_max_ts_update ) { @@ -396,7 +410,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev HASH_ITER(hh, s_event_clean_dup_items, l_clean_item, l_clean_tmp) { if ( dap_strcmp(l_max_ts_update_hash, l_clean_item->hash_str) != 0 ) { // delete dup by older - dap_chain_global_db_gr_del(dap_strdup(l_clean_item->hash_str), l_gdb_group_events); + dap_chain_global_db_gr_del(l_clean_item->hash_str, l_gdb_group_events); } HASH_DEL(s_event_clean_dup_items, l_clean_item); DAP_DELETE(l_clean_item); @@ -405,7 +419,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev dap_store_obj_free(l_events_round, l_events_round_size); } -static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, +static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, size_t a_event_size, char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { if ( a_event->header.signs_count < a_event_round_cfg->confirmations_minimum ) { @@ -439,8 +453,8 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_e if ( a_event->header.signs_count >= PVT(l_poa)->auth_certs_count) { // placement in chain now if max signs - if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000, - (dap_timerfd_callback_t)s_callback_round_event_to_chain, + if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000, + (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_callback_arg) == NULL) { log_it(L_ERROR,"Can't run timer for Event %s", a_event_hash_hex_str); } else { @@ -451,16 +465,16 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_e l_timeout = l_timeout - ((uint64_t)time(NULL) - a_event_round_cfg->ts_confirmations_minimum_completed); // placement in chain by timer l_timeout += PVT(l_poa)->wait_sync_before_complete; - if (dap_timerfd_start(l_timeout*1000, - (dap_timerfd_callback_t)s_callback_round_event_to_chain, + if (dap_timerfd_start(l_timeout*1000, + (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_callback_arg) == NULL) { log_it(L_ERROR,"Can't run timer for Event %s", a_event_hash_hex_str); } else { log_it(L_NOTICE,"Run timer %dsec. for Event %s", l_timeout, a_event_hash_hex_str); } } else { // placement in chain now if timer out - if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000, - (dap_timerfd_callback_t)s_callback_round_event_to_chain, + if (dap_timerfd_start(PVT(l_poa)->wait_sync_before_complete*1000, + (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_callback_arg) == NULL) { log_it(L_ERROR,"Can't run timer for Event %s", a_event_hash_hex_str); } else { @@ -487,9 +501,9 @@ static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_ if ( (l_event = dap_chain_cs_dag_event_gdb_get( a_callback_arg->l_event_hash_hex_str, &l_event_size, l_gdb_group_events, &l_event_round_cfg )) == NULL ){ - log_it(L_NOTICE,"Can't find event %s in round.new. The hash may have changed by reason the addition of a new signature.", + log_it(L_NOTICE,"Can't find event %s in round.new. The hash may have changed by reason the addition of a new signature.", a_callback_arg->l_event_hash_hex_str); - } + } else { dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event, l_event_size); memcpy(l_new_atom, l_event, l_event_size); @@ -504,7 +518,7 @@ static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_ if (dap_chain_cell_file_update(l_dag->chain->cells) > 0) { // delete events from db - dap_chain_global_db_gr_del(dap_strdup(a_callback_arg->l_event_hash_hex_str), l_dag->gdb_group_events_round_new); + dap_chain_global_db_gr_del(a_callback_arg->l_event_hash_hex_str, l_dag->gdb_group_events_round_new); } dap_chain_cell_close(l_dag->chain->cells); // dap_chain_net_sync_all(l_net); @@ -544,7 +558,7 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c } /** - * @brief + * @brief * delete dap_chain_cs_dag_poa_pvt_t callback * @param a_dag dap_chain_cs_dag_t object */ @@ -570,14 +584,14 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag) } /** - * @brief + * @brief * callback for create event operation * @param a_dag dap_chain_cs_dag_t DAG object * @param a_datum dap_chain_datum_t - * @param a_hashes dap_chain_hash_fast_t + * @param a_hashes dap_chain_hash_fast_t * @param a_hashes_count size_t * @param a_dag_event_size size_t - * @return dap_chain_cs_dag_event_t* + * @return dap_chain_cs_dag_event_t* */ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size) @@ -617,20 +631,20 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event; // dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_event_round_item->event, l_event_size); size_t l_event_size_new = 0; - dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, + dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, &l_event_size_new, l_net, PVT(l_poa)->events_sign_cert->enc_key); - + if ( l_event_new ) { char * l_gdb_group_events = a_dag->gdb_group_events_round_new; dap_chain_hash_fast_t l_event_new_hash; dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size_new, &l_event_new_hash); char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); - bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event_new, l_event_size_new, + bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event_new, l_event_size_new, l_event_new_hash_hex_str, &l_event_round_item->cfg); if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event_new, l_event_size_new, l_gdb_group_events, &l_event_round_item->cfg) ){ - dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_events); // Delete old event + dap_chain_global_db_gr_del( a_key, l_gdb_group_events); // Delete old event if (l_event_is_ready && PVT(l_poa)->auto_round_complete) { // cs done (minimum signs & verify passed) s_round_event_cs_done(a_dag, l_event_new, l_event_new_hash_hex_str, &l_event_round_item->cfg); } @@ -650,12 +664,12 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ } /** - * @brief + * @brief * function makes event singing verification * @param a_dag dag object * @param a_dag_event dap_chain_cs_dag_event_t * @param a_dag_event_size size_t size of event object - * @return int + * @return int */ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size) { diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 32dd78083267ac875eca7e2fa34fda4442fb00aa..b930ddfec7bf3286af3e538ffc745a95776705b0 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -373,8 +373,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_hash_item->datum_data_hash ); dap_chain_hash_fast_to_str(&l_hash_item->datum_data_hash,l_hash_item->key,sizeof(l_hash_item->key)-1); if (!l_gdb_priv->is_load_mode) { - dap_chain_global_db_gr_set(dap_strdup(l_hash_item->key), DAP_DUP_SIZE(l_datum, l_datum_size), - l_datum_size, l_gdb_priv->group_datums); + dap_chain_global_db_gr_set(l_hash_item->key, l_datum, l_datum_size, l_gdb_priv->group_datums); } else log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums); diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c index be114e090cd24a3b4579cdf4ab6b0284d8a0af95..da89542409c95420fcdf35af3941426d0e64f1d4 100644 --- a/modules/global-db/dap_chain_global_db.c +++ b/modules/global-db/dap_chain_global_db.c @@ -77,10 +77,12 @@ typedef struct sync_group_item static sync_group_item_t *s_sync_group_items = NULL; static sync_group_item_t *s_sync_group_extra_items = NULL; static bool s_track_history = false; +static bool s_db_drvmode_async = false; + /** * @brief Adds a group name for synchronization. - * @param a_group_prefix a prefix of the group name + * @param a_group_prefix a prefix of the group name * @param a_callback a callback function * @param a_arg a pointer to an argument * @return (none) @@ -127,7 +129,7 @@ dap_list_t *dap_chain_db_get_sync_groups_internal(sync_group_item_t *a_table) return l_ret; } -/** +/** * @brief Gets a list of a group mask for s_sync_group_items. * @return Returns a pointer to a list of a group mask. */ @@ -136,7 +138,7 @@ dap_list_t *dap_chain_db_get_sync_groups() return dap_chain_db_get_sync_groups_internal(s_sync_group_items); } -/** +/** * @brief Gets a list of a group mask for s_sync_group_items. * @param a_table a table * @return Returns a pointer to a list of a group mask. @@ -163,7 +165,7 @@ void dap_chain_global_db_obj_clean(dap_global_db_obj_t *obj) /** * @brief Deallocates memory of an obj structure. - * @param obj a pointer to the object + * @param obj a pointer to the object * @return (none) */ void dap_chain_global_db_obj_delete(dap_global_db_obj_t *obj) @@ -187,7 +189,7 @@ void dap_chain_global_db_objs_delete(dap_global_db_obj_t *objs, size_t a_count) } /** - * @brief Initializes a database by g_config structure. + * @brief Initializes a database by g_config structure. * @note You should call this function before calling any other functions in this library. * @param g_config a pointer to the configuration structure * @return Returns 0 if successful; otherwise, <0. @@ -197,19 +199,26 @@ int dap_chain_global_db_init(dap_config_t * g_config) const char *l_storage_path = dap_config_get_item_str(g_config, "resources", "dap_global_db_path"); const char *l_driver_name = dap_config_get_item_str_default(g_config, "resources", "dap_global_db_driver", "sqlite"); //const char *l_driver_name = dap_config_get_item_str_default(g_config, "resources", "dap_global_db_driver", "cdb"); + s_track_history = dap_config_get_item_bool_default(g_config, "resources", "dap_global_db_track_history", s_track_history); + + s_db_drvmode_async = dap_config_get_item_bool(g_config, "resources", "dap_global_db_drvmode_async"); + log_it(L_NOTICE,"DB Driver Async mode: %s", s_db_drvmode_async ? "ON": "Off"); + lock(); - int res = dap_db_driver_init(l_driver_name, l_storage_path); + int res = dap_db_driver_init(l_driver_name, l_storage_path, s_db_drvmode_async); unlock(); + if( res != 0 ) log_it(L_CRITICAL, "Hadn't initialized db driver \"%s\" on path \"%s\"", l_driver_name, l_storage_path); else log_it(L_NOTICE,"GlobalDB initialized"); + return res; } /** - * @brief Deinitialize a database. + * @brief Deinitialize a database. * @note You should call this function at the end. * @return (none) */ @@ -266,7 +275,7 @@ void* dap_chain_global_db_obj_get(const char *a_key, const char *a_group) * @param a_key an object key string * @param a_data_len_out[in] a number of objects to be gotten, if NULL - no limits * @param a_data_len_out[out] a number of objects that were gotten - * @param a_group a group name string + * @param a_group a group name string * @return If successful, returns a pointer to the first item in the array; otherwise NULL. */ dap_store_obj_t* dap_chain_global_db_obj_gr_get(const char *a_key, size_t *a_data_len_out, const char *a_group) @@ -330,48 +339,49 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out) */ static bool global_db_gr_del_add(char *a_key,const char *a_group, time_t a_timestamp) { - dap_store_obj_t store_data = {}; - store_data.type = 'a'; +dap_store_obj_t store_data = {0}; +char l_group[DAP_DB_K_MAXGRPLEN]; +int l_res = 0; + store_data.key = a_key; // group = parent group + '.del' - store_data.group = dap_strdup_printf("%s.del", a_group); + dap_snprintf(l_group, sizeof(l_group) - 1, "%s.del", a_group); + store_data.group = l_group; store_data.timestamp = a_timestamp; + lock(); - int l_res = 0; if (!dap_chain_global_db_driver_is(store_data.group, store_data.key)) l_res = dap_chain_global_db_driver_add(&store_data, 1); unlock(); - DAP_DELETE(store_data.group); - if(l_res>=0) - return true; - return false; + + return (l_res >= 0); /* ? true : false; */ } /** * @brief Deletes info about the deleted object from the database * @param a_key an object key string, looked like "0x8FAFBD00B..." * @param a_group a group name string, for example "kelvin-testnet.nodes" - * @return If successful, returns true; otherwise, false. + * @return If successful, returns true; otherwise, false. */ -static bool global_db_gr_del_del(char *a_key, const char *a_group) +static bool global_db_gr_del_del(const char *a_key, const char *a_group) { +dap_store_obj_t store_data = {0}; +char l_group[DAP_DB_K_MAXGRPLEN]; +int l_res = 0; + if(!a_key) return NULL; - dap_store_obj_t store_data; - memset(&store_data, 0, sizeof(dap_store_obj_t)); + store_data.key = a_key; - // store_data->c_key = a_key; - store_data.group = dap_strdup_printf("%s.del", a_group); - //store_data->c_group = a_group; + dap_snprintf(l_group, sizeof(l_group) - 1, "%s.del", a_group); + store_data.group = l_group; + lock(); - int l_res = 0; if(dap_chain_global_db_driver_is(store_data.group, store_data.key)) l_res = dap_chain_global_db_driver_delete(&store_data, 1); unlock(); - DAP_DELETE(store_data.group); - if(l_res>=0) - return true; - return false; + + return (l_res >= 0); /* ? true : false; */ } /** @@ -486,10 +496,10 @@ dap_global_db_obj_t* dap_chain_global_db_load(size_t *a_data_size_out) } /** - * @brief Finds item by a_items and a_group + * @brief Finds item by a_items and a_group * @param a_items items * @param a_group a group name string - * @return + * @return */ static sync_group_item_t *find_item_by_mask(sync_group_item_t *a_items, const char *a_group) { @@ -503,7 +513,7 @@ static sync_group_item_t *find_item_by_mask(sync_group_item_t *a_items, const ch /** * @brief Adds data to the history log - * + * * @param a_store_data a pointer to an object * @return (none) */ @@ -514,37 +524,28 @@ void dap_global_db_obj_track_history(void* a_store_data) if (l_sync_group_item) { if(l_sync_group_item->callback_notify) { l_sync_group_item->callback_notify(l_sync_group_item->callback_arg, - (const char)l_obj->type, + l_obj->type, l_obj->group, l_obj->key, l_obj->value, l_obj->value_len); } if (!s_track_history) { lock(); - dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_group_item->group_name_for_history); + dap_db_history_add(l_obj->type, l_obj, 1, l_sync_group_item->group_name_for_history); unlock(); - } else { - DAP_DELETE(l_obj->key); - DAP_DEL_Z(l_obj->value); } } else { // looking for extra group sync_group_item_t *l_sync_extra_group_item = find_item_by_mask(s_sync_group_extra_items, l_obj->group); if(l_sync_extra_group_item) { if(l_sync_extra_group_item->callback_notify) { l_sync_extra_group_item->callback_notify(l_sync_extra_group_item->callback_arg, - (const char)l_obj->type, l_obj->group, l_obj->key, + l_obj->type, l_obj->group, l_obj->key, l_obj->value, l_obj->value_len); } if (!s_track_history) { lock(); - dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_extra_group_item->group_name_for_history); + dap_db_history_add(l_obj->type, l_obj, 1, l_sync_extra_group_item->group_name_for_history); unlock(); - } else { - DAP_DELETE(l_obj->key); - DAP_DEL_Z(l_obj->value); } - } else { - DAP_DELETE(l_obj->key); - DAP_DEL_Z(l_obj->value); } } } @@ -558,15 +559,16 @@ void dap_global_db_obj_track_history(void* a_store_data) * @details Set one entry to base. IMPORTANT: a_key and a_value should be passed without free after (it will be released by gdb itself) * @return True if successful, false otherwise. */ -bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, const char *a_group) +bool dap_chain_global_db_gr_set(const char *a_key, const void *a_value, size_t a_value_len, const char *a_group) { - dap_store_obj_t store_data; - memset(&store_data, 0, sizeof(dap_store_obj_t)); - store_data.key = dap_strdup(a_key); - store_data.value_len = (a_value_len == (size_t) -1) ? dap_strlen((const char*) a_value) : a_value_len; - store_data.value = store_data.value_len ? DAP_DUP_SIZE(a_value, store_data.value_len) : NULL; - store_data.group = (char*)a_group; +dap_store_obj_t store_data = {0}; + + store_data.key = a_key; + store_data.value_len = (a_value_len == (size_t) -1) ? dap_strlen(a_value) : a_value_len; + store_data.value = store_data.value_len ? a_value : NULL; + store_data.group = a_group; store_data.timestamp = time(NULL); + lock(); int l_res = dap_chain_global_db_driver_add(&store_data, 1); unlock(); @@ -574,13 +576,13 @@ bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, // Extract prefix if added successfuly, add history log and call notify callback if present if(!l_res) { // delete info about the deleted entry from the base if one present - global_db_gr_del_del(dap_strdup(a_key), a_group); + global_db_gr_del_del( a_key, a_group); + store_data.value = a_value; store_data.key = a_key; + dap_global_db_obj_track_history(&store_data); } else { - DAP_DEL_Z(a_value); - DAP_DELETE(a_key); log_it(L_ERROR, "Save error: %d", l_res); } @@ -598,32 +600,32 @@ bool dap_chain_global_db_set( char *a_key, void *a_value, size_t a_value_len) return dap_chain_global_db_gr_set(a_key, a_value, a_value_len, GROUP_LOCAL_GENERAL); } -/** +/** * @brief Deletes object from a database by a a_key and a_group arguments. * @param a_key a object key string * @param a_group a group name string * @return True if object was deleted or false otherwise. */ -bool dap_chain_global_db_gr_del(char *a_key,const char *a_group) +bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group) { - dap_store_obj_t store_data; - memset(&store_data, 0, sizeof(dap_store_obj_t)); - store_data.key = dap_strdup(a_key); +dap_store_obj_t store_data = {0}; + + store_data.key = a_key; store_data.group = (char*)a_group; + lock(); int l_res = dap_chain_global_db_driver_delete(&store_data, 1); unlock(); + if (a_key) { if (l_res >= 0) { // add to Del group - global_db_gr_del_add(dap_strdup(a_key), store_data.group, time(NULL)); + global_db_gr_del_add(a_key, store_data.group, time(NULL)); } // do not add to history if l_res=1 (already deleted) if (!l_res) { - store_data.key = a_key; + store_data.key = (char *) a_key; dap_global_db_obj_track_history(&store_data); - } else { - DAP_DELETE(a_key); } } return !l_res; @@ -635,41 +637,34 @@ bool dap_chain_global_db_gr_del(char *a_key,const char *a_group) * @param a_objs_count a number of objects * @return True if object was deleted or false otherwise. */ -bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count) +bool dap_chain_global_db_obj_save(dap_store_obj_t *a_store_data, size_t a_objs_count) { - // save/delete data +dap_store_obj_t *l_store_obj; + + /* Do we need something to do at all ? */ if(!a_objs_count) return true; - char *l_keys[a_objs_count]; - void *l_vals[a_objs_count]; - for(size_t i = 0; i < a_objs_count; i++) { - dap_store_obj_t *l_store_obj = (dap_store_obj_t *)a_store_data + i; - l_keys[i] = dap_strdup(l_store_obj->key); - l_vals[i] = DAP_DUP_SIZE(l_store_obj->value, l_store_obj->value_len); - } lock(); - int l_res = dap_chain_global_db_driver_appy(a_store_data, a_objs_count); + int l_res = dap_chain_global_db_driver_apply(a_store_data, a_objs_count); unlock(); - for(size_t i = 0; i < a_objs_count; i++) { - dap_store_obj_t *l_store_obj = (dap_store_obj_t *)a_store_data + i; - l_store_obj->key = l_keys[i]; - l_store_obj->value = l_vals[i]; - if (l_store_obj->type == 'a' && !l_res) + l_store_obj = (dap_store_obj_t *)a_store_data; + + for(int i = a_objs_count; i--; l_store_obj++) { + if (l_store_obj->type == DAP_DB$K_OPTYPE_ADD && !l_res) // delete info about the deleted entry from the base if one present - global_db_gr_del_del(dap_strdup(l_store_obj->key), l_store_obj->group); - else if (l_store_obj->type == 'd' && l_res >= 0) + global_db_gr_del_del(l_store_obj->key, l_store_obj->group); + else if (l_store_obj->type == DAP_DB$K_OPTYPE_ADD && l_res >= 0) // add to Del group - global_db_gr_del_add(dap_strdup(l_store_obj->key), l_store_obj->group, l_store_obj->timestamp); + global_db_gr_del_add(l_store_obj->key, l_store_obj->group, l_store_obj->timestamp); + if (!l_res) { // Extract prefix if added successfuly, add history log and call notify callback if present dap_global_db_obj_track_history(l_store_obj); - } else { - DAP_DELETE(l_store_obj->key); - DAP_DELETE(l_store_obj->value); } } + return !l_res; } @@ -682,23 +677,23 @@ bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count) */ bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_count, const char *a_group) { - dap_store_obj_t *l_store_data = DAP_NEW_Z_SIZE(dap_store_obj_t, a_objs_count * sizeof(struct dap_store_obj)); - if (!l_store_data) - return false; - time_t l_timestamp = time(NULL); - for(size_t q = 0; q < a_objs_count; ++q) { - dap_store_obj_t *store_data_cur = l_store_data + q; - dap_global_db_obj_t *a_obj_cur = a_objs + q; - store_data_cur->type = 'a'; - store_data_cur->key = a_obj_cur->key; - store_data_cur->group = (char*)a_group; - store_data_cur->value = a_obj_cur->value; - store_data_cur->value_len = a_obj_cur->value_len; +dap_store_obj_t l_store_data[a_objs_count], *store_data_cur; +dap_global_db_obj_t *l_obj_cur; +time_t l_timestamp = time(NULL); + + store_data_cur = l_store_data; + l_obj_cur = a_objs; + + for(int i = a_objs_count; i--; store_data_cur++, l_obj_cur++ ) { + store_data_cur->type = DAP_DB$K_OPTYPE_ADD; + store_data_cur->key = l_obj_cur->key; + store_data_cur->group = (char*) a_group; + store_data_cur->value = l_obj_cur->value; + store_data_cur->value_len = l_obj_cur->value_len; store_data_cur->timestamp = l_timestamp; } - int l_res = dap_chain_global_db_obj_save(l_store_data, a_objs_count); - DAP_DELETE(l_store_data); - return l_res; + + return dap_chain_global_db_obj_save(l_store_data, a_objs_count); } /** diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c index 98e9e26cac2db2e2ee1f4bb6902de021dc2e239e..45d7dff218ba4d787268f1474e0da7696803ab14 100644 --- a/modules/global-db/dap_chain_global_db_driver.c +++ b/modules/global-db/dap_chain_global_db_driver.c @@ -46,41 +46,20 @@ // A selected database driver. static char *s_used_driver = NULL; -//#define USE_WRITE_BUFFER - -#ifdef USE_WRITE_BUFFER -static int save_write_buf(void); - -// for write buffer -pthread_mutex_t s_mutex_add_start = PTHREAD_MUTEX_INITIALIZER; -pthread_mutex_t s_mutex_add_end = PTHREAD_MUTEX_INITIALIZER; -//pthread_rwlock_rdlock -// new data in buffer to write -pthread_mutex_t s_mutex_cond = PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t s_cond_add_end; // = PTHREAD_COND_INITIALIZER; -// writing ended -pthread_mutex_t s_mutex_write_end = PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t s_cond_write_end; // = PTHREAD_COND_INITIALIZER; - -dap_list_t *s_list_begin = NULL; -dap_list_t *s_list_end = NULL; - -pthread_t s_write_buf_thread; -volatile static bool s_write_buf_state = 0; -static void* func_write_buf(void * arg); -#endif //USE_WRITE_BUFFER - static dap_db_driver_callbacks_t s_drv_callback; +static bool s_db_drvmode_async = false; /** - * @brief Initializes a database driver. + * @brief Initializes a database driver. * @note You should Call this function before using the driver. * @param driver_name a string determining a type of database driver: * "Ñdb", "sqlite" ("sqlite3") or "pgsql" * @param a_filename_db a path to a database file + * @param db_drvmode_async a flag to switch DB Engine to "Async" mode * @return Returns 0, if successful; otherwise <0. */ -int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db) +int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db, + bool db_drvmode_async) { int l_ret = -1; if(s_used_driver) @@ -88,11 +67,13 @@ int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db) // Fill callbacks with zeros memset(&s_drv_callback, 0, sizeof(dap_db_driver_callbacks_t)); + s_db_drvmode_async = db_drvmode_async; // Setup driver name s_used_driver = dap_strdup(a_driver_name); dap_mkdir_with_parents(a_filename_db); + // Compose path char l_db_path_ext[strlen(a_driver_name) + strlen(a_filename_db) + 6]; dap_snprintf(l_db_path_ext, sizeof(l_db_path_ext), "%s/gdb-%s", a_filename_db, a_driver_name); @@ -101,31 +82,19 @@ int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db) if(!dap_strcmp(s_used_driver, "ldb")) l_ret = -1; else if(!dap_strcmp(s_used_driver, "sqlite") || !dap_strcmp(s_used_driver, "sqlite3") ) - l_ret = dap_db_driver_sqlite_init(l_db_path_ext, &s_drv_callback); + l_ret = dap_db_driver_sqlite_init(l_db_path_ext, &s_drv_callback, db_drvmode_async); else if(!dap_strcmp(s_used_driver, "cdb")) - l_ret = dap_db_driver_cdb_init(l_db_path_ext, &s_drv_callback); + l_ret = dap_db_driver_cdb_init(l_db_path_ext, &s_drv_callback, db_drvmode_async); #ifdef DAP_CHAIN_GDB_ENGINE_MDBX else if(!dap_strcmp(s_used_driver, "mdbx")) - l_ret = dap_db_driver_mdbx_init(l_db_path_ext, &s_drv_callback); + l_ret = dap_db_driver_mdbx_init(l_db_path_ext, &s_drv_callback, db_drvmode_async); #endif #ifdef DAP_CHAIN_GDB_ENGINE_PGSQL else if(!dap_strcmp(s_used_driver, "pgsql")) - l_ret = dap_db_driver_pgsql_init(l_db_path_ext, &s_drv_callback); + l_ret = dap_db_driver_pgsql_init(l_db_path_ext, &s_drv_callback, db_drvmode_async); #endif else log_it(L_ERROR, "Unknown global_db driver \"%s\"", a_driver_name); -#ifdef USE_WRITE_BUFFER - if(!l_ret) { - pthread_condattr_t l_condattr; - pthread_condattr_init(&l_condattr); - pthread_condattr_setclock(&l_condattr, CLOCK_MONOTONIC); - pthread_cond_init(&s_cond_add_end, &l_condattr); - pthread_cond_init(&s_cond_write_end, &l_condattr); - // thread for save buffer to database - s_write_buf_state = true; - pthread_create(&s_write_buf_thread, NULL, func_write_buf, NULL); - } -#endif return l_ret; } @@ -136,33 +105,6 @@ int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db) */ void dap_db_driver_deinit(void) { -#ifdef USE_WRITE_BUFFER - // wait for close thread - { - pthread_mutex_lock(&s_mutex_cond); - pthread_cond_broadcast(&s_cond_add_end); - pthread_mutex_unlock(&s_mutex_cond); - - s_write_buf_state = false; - pthread_join(s_write_buf_thread, NULL); - } - - //save_write_buf(); - pthread_mutex_lock(&s_mutex_add_end); - pthread_mutex_lock(&s_mutex_add_start); - while(s_list_begin != s_list_end) { - // free memory - dap_store_obj_free((dap_store_obj_t*) s_list_begin->data, 1); - dap_list_free1(s_list_begin); - s_list_begin = dap_list_next(s_list_begin); - } - //dap_store_obj_free((dap_store_obj_t*) s_list_begin->data, 1); - dap_list_free1(s_list_begin); - s_list_begin = s_list_end = NULL; - pthread_mutex_unlock(&s_mutex_add_start); - pthread_mutex_unlock(&s_mutex_add_end); - pthread_cond_destroy(&s_cond_add_end); -#endif // deinit driver if(s_drv_callback.deinit) s_drv_callback.deinit(); @@ -232,6 +174,7 @@ char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size) { if(!data || !data_size) return NULL; + dap_chain_hash_fast_t l_hash; memset(&l_hash, 0, sizeof(dap_chain_hash_fast_t)); dap_hash_fast(data, data_size, &l_hash); @@ -245,229 +188,41 @@ char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size) return a_str; } -/** - * @brief Waits for a buffer to be written. - * @param a_mutex a mutex - * @param a_cond a condition - * @param l_timeout_ms timeout in ms, if -1 endless waiting - * @return Returns 0 if successful or 1 when the timeout is due. - */ -static int wait_data(pthread_mutex_t *a_mutex, pthread_cond_t *a_cond, int l_timeout_ms) -{ - int l_res = 0; - pthread_mutex_lock(a_mutex); - // endless waiting - if(l_timeout_ms == -1) - l_res = pthread_cond_wait(a_cond, a_mutex); - // waiting no more than timeout in milliseconds - else { - struct timespec l_to; - clock_gettime(CLOCK_MONOTONIC, &l_to); - int64_t l_nsec_new = l_to.tv_nsec + l_timeout_ms * 1000000ll; - // if the new number of nanoseconds is more than a second - if(l_nsec_new > (long) 1e9) { - l_to.tv_sec += l_nsec_new / (long) 1e9; - l_to.tv_nsec = l_nsec_new % (long) 1e9; - } - else - l_to.tv_nsec = (long) l_nsec_new; - l_res = pthread_cond_timedwait(a_cond, a_mutex, &l_to); - } - pthread_mutex_unlock(a_mutex); - if(l_res == ETIMEDOUT) - return 1; - return l_res; -} - -#ifdef USE_WRITE_BUFFER -/** - * @brief Checks if a buffer is not empty. - * @return Returns true if the buffer is not empty, false if it is empty. - */ -static bool check_fill_buf(void) -{ - dap_list_t *l_list_begin; - dap_list_t *l_list_end; - pthread_mutex_lock(&s_mutex_add_start); - pthread_mutex_lock(&s_mutex_add_end); - l_list_end = s_list_end; - l_list_begin = s_list_begin; - pthread_mutex_unlock(&s_mutex_add_end); - pthread_mutex_unlock(&s_mutex_add_start); - - bool l_ret = (l_list_begin != l_list_end) ? 1 : 0; -// if(l_ret) -// printf("** Wait s_beg=0x%x s_end=0x%x \n", l_list_begin, l_list_end); - return l_ret; -} - -/** - * @brief Waits until the buffer is not empty. - * @return (none) - */ -static void wait_write_buf() -{ -// printf("** Start wait data\n"); - // wait data - while(1) { - if(!check_fill_buf()) - break; - if(!wait_data(&s_mutex_write_end, &s_cond_write_end, 50)) - break; - } -// printf("** End wait data\n"); -} - -/** - * @brief Saves data from a buffer to a database. - * @return 0 - */ -static int save_write_buf(void) -{ - dap_list_t *l_list_end; - // fix end of buffer - pthread_mutex_lock(&s_mutex_add_end); - l_list_end = s_list_end; - pthread_mutex_unlock(&s_mutex_add_end); - // save data from begin to fixed end - pthread_mutex_lock(&s_mutex_add_start); - if(s_list_begin != l_list_end) { - if(s_drv_callback.transaction_start) - s_drv_callback.transaction_start(); - int cnt = 0; - while(s_list_begin != l_list_end) { - // apply to database - dap_store_obj_t *l_obj = s_list_begin->data; - assert(l_obj); - if(s_drv_callback.apply_store_obj) { - int l_ret_tmp = s_drv_callback.apply_store_obj(l_obj); - if(l_ret_tmp == 1) { - log_it(L_INFO, "item is missing (may be already deleted) %s/%s\n", l_obj->group, l_obj->key); - l_ret = 1; - } - if(l_ret_tmp < 0) { - log_it(L_ERROR, "Can't write item %s/%s\n", l_obj->group, l_obj->key); - l_ret -= 1; - } - /*if(!s_drv_callback.apply_store_obj(l_obj)) { - //log_it(L_INFO, "Write item Ok %s/%s\n", l_obj->group, l_obj->key); - } - else { - log_it(L_ERROR, "Can't write item %s/%s\n", l_obj->group, l_obj->key); - }*/ - } - - s_list_begin = dap_list_next(s_list_begin); -// printf("** ap2*record *l_beg=0x%x l_nex=0x%x d_beg=0x%x l_end=0x%x d_end=0x%x sl_end=0x%x\n", s_list_begin, - // s_list_begin->next, s_list_begin->data, l_list_end, l_list_end->data, s_list_end); - - //printf("** free data=0x%x list=0x%x\n", s_list_begin->prev->data, s_list_begin->prev); - // free memory - dap_store_obj_free((dap_store_obj_t*) s_list_begin->prev->data, 1); - dap_list_free1(s_list_begin->prev); - s_list_begin->prev = NULL; - cnt++; - } - if(s_drv_callback.transaction_end) - s_drv_callback.transaction_end(); - //printf("** writing ended cnt=%d\n", cnt); - // writing ended - pthread_mutex_lock(&s_mutex_write_end); - pthread_cond_broadcast(&s_cond_write_end); - pthread_mutex_unlock(&s_mutex_write_end); - } - pthread_mutex_unlock(&s_mutex_add_start); - return 0; -} - -/** - * @brief A thread for saving data from buffer to a database - * @param arg NULL, is not used - * @return NULL - */ -static void* func_write_buf(void * arg) -{ - while(1) { - if(!s_write_buf_state) - break; - //save_write_buf - if(save_write_buf() == 0) { - if(!s_write_buf_state) - break; - // wait data - wait_data(&s_mutex_cond, &s_cond_add_end, 2000); // 2 sec - } - } - return NULL; -} -#endif //USE_WRITE_BUFFER - /** * @brief Applies objects to database. * @param a_store an pointer to the objects * @param a_store_count a number of objectss * @return Returns 0, if successful. */ -int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store_count) +int dap_chain_global_db_driver_apply(pdap_store_obj_t a_store_obj, size_t a_store_count) { - //dap_store_obj_t *l_store_obj = dap_store_obj_copy(a_store_obj, a_store_count); +int l_ret; +dap_store_obj_t *l_store_obj_cur; + if(!a_store_obj || !a_store_count) return -1; -#ifdef USE_WRITE_BUFFER - // add all records into write buffer - pthread_mutex_lock(&s_mutex_add_end); - for(size_t i = 0; i < a_store_count; i++) { - dap_store_obj_t *l_store_obj_cur = dap_store_obj_copy(a_store_obj + i, 1); - // first record in buf - if(!s_list_end) { - s_list_end = dap_list_append(s_list_end, l_store_obj_cur); - pthread_mutex_lock(&s_mutex_add_start); - s_list_begin = s_list_end; - pthread_mutex_unlock(&s_mutex_add_start); - //log_it(L_DEBUG,"First record in list: *!!add record=0x%x / 0x%x obj=0x%x / 0x%x\n", s_list_end, s_list_end->data, s_list_end->prev); - } - else - s_list_end->data = l_store_obj_cur; - dap_list_append(s_list_end, NULL); - s_list_end = dap_list_last(s_list_end); - //log_it(L_DEBUG, "**+add record l_cur=0x%x / 0x%x l_new=0x%x / 0x%x\n", s_list_end->prev, s_list_end->prev->data,s_list_end, s_list_end->data); - } - // buffer changed - pthread_mutex_lock(&s_mutex_cond); - pthread_cond_broadcast(&s_cond_add_end); - pthread_mutex_unlock(&s_mutex_cond); - pthread_mutex_unlock(&s_mutex_add_end); - return 0; -#else - int l_ret = 0; + // apply to database if(a_store_count > 1 && s_drv_callback.transaction_start) s_drv_callback.transaction_start(); + l_store_obj_cur = a_store_obj; /* We have to use a power of the address's incremental arithmetic */ + l_ret = 0; /* Preset return code to OK */ + if(s_drv_callback.apply_store_obj) - for(size_t i = 0; i < a_store_count; i++) { - dap_store_obj_t *l_store_obj_cur = a_store_obj + i; - assert(l_store_obj_cur); - char *l_cur_key = dap_strdup(l_store_obj_cur->key); - int l_ret_tmp = s_drv_callback.apply_store_obj(l_store_obj_cur); - if(l_ret_tmp == 1) { - log_it(L_INFO, "Item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_cur_key); - l_ret = 1; - } - if(l_ret_tmp < 0) { - log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_cur_key, l_ret_tmp); - l_ret -= 1; - } - DAP_DEL_Z(l_cur_key); - if (l_ret) - break; + for(int i = a_store_count; (!l_ret) && i--; l_store_obj_cur++) { + assert(l_store_obj_cur); /* Sanity check */ + + if ( 1 == (l_ret = s_drv_callback.apply_store_obj(l_store_obj_cur)) ) + log_it(L_INFO, "Item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_store_obj_cur->key); + else if (l_ret < 0) + log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_store_obj_cur->key, l_ret); } if(a_store_count > 1 && s_drv_callback.transaction_end) s_drv_callback.transaction_end(); - return l_ret; -#endif + return l_ret; } /** @@ -478,9 +233,12 @@ int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store */ int dap_chain_global_db_driver_add(pdap_store_obj_t a_store_obj, size_t a_store_count) { - for(size_t i = 0; i < a_store_count; i++) - a_store_obj[i].type = 'a'; - return dap_chain_global_db_driver_appy(a_store_obj, a_store_count); +dap_store_obj_t *l_store_obj_cur = a_store_obj; + + for(int i = a_store_count; i--; l_store_obj_cur++) + l_store_obj_cur->type = DAP_DB$K_OPTYPE_ADD; + + return dap_chain_global_db_driver_apply(a_store_obj, a_store_count); } /** @@ -491,9 +249,12 @@ int dap_chain_global_db_driver_add(pdap_store_obj_t a_store_obj, size_t a_store_ */ int dap_chain_global_db_driver_delete(pdap_store_obj_t a_store_obj, size_t a_store_count) { - for(size_t i = 0; i < a_store_count; i++) - a_store_obj[i].type = 'd'; - return dap_chain_global_db_driver_appy(a_store_obj, a_store_count); +dap_store_obj_t *l_store_obj_cur = a_store_obj; + + for(int i = a_store_count; i--; l_store_obj_cur++) + l_store_obj_cur->type = DAP_DB$K_OPTYPE_DEL; + + return dap_chain_global_db_driver_apply(a_store_obj, a_store_count); } /** @@ -535,10 +296,6 @@ dap_list_t *dap_chain_global_db_driver_get_groups_by_mask(const char *a_group_ma dap_store_obj_t* dap_chain_global_db_driver_read_last(const char *a_group) { dap_store_obj_t *l_ret = NULL; -#ifdef USE_WRITE_BUFFER - // wait apply write buffer - wait_write_buf(); -#endif // read records using the selected database engine if(s_drv_callback.read_last_store_obj) l_ret = s_drv_callback.read_last_store_obj(a_group); @@ -556,10 +313,6 @@ dap_store_obj_t* dap_chain_global_db_driver_read_last(const char *a_group) dap_store_obj_t* dap_chain_global_db_driver_cond_read(const char *a_group, uint64_t id, size_t *a_count_out) { dap_store_obj_t *l_ret = NULL; -#ifdef USE_WRITE_BUFFER - // wait apply write buffer - wait_write_buf(); -#endif // read records using the selected database engine if(s_drv_callback.read_cond_store_obj) l_ret = s_drv_callback.read_cond_store_obj(a_group, id, a_count_out); @@ -578,10 +331,6 @@ dap_store_obj_t* dap_chain_global_db_driver_cond_read(const char *a_group, uint6 dap_store_obj_t* dap_chain_global_db_driver_read(const char *a_group, const char *a_key, size_t *a_count_out) { dap_store_obj_t *l_ret = NULL; -#ifdef USE_WRITE_BUFFER - // wait apply write buffer - wait_write_buf(); -#endif // read records using the selected database engine if(s_drv_callback.read_store_obj) l_ret = s_drv_callback.read_store_obj(a_group, a_key, a_count_out); 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 f41b91f6b5dcb29d14186f6ce7fedecba8ffac4d..16252d46783a000909f27b4c946eeae623201f29 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -28,6 +28,11 @@ #include <pthread.h> #include <sys/stat.h> #include <uthash.h> +#include <pthread.h> +#include <errno.h> +#include <stdatomic.h> + + #define _GNU_SOURCE #include "dap_common.h" @@ -62,6 +67,51 @@ static pcdb_instance s_cdb = NULL; static pthread_mutex_t cdb_mutex = PTHREAD_MUTEX_INITIALIZER; /** A read-write lock for working with a CDB instanse. */ static pthread_rwlock_t cdb_rwlock = PTHREAD_RWLOCK_INITIALIZER; +/** Mode of request processing */ +static bool s_db_drvmode_async = false; + +/* A list of the request to be executed by processor thread */ +static struct __cuttdb_req_list__ { + struct __cuttdb_req_list__ *next; + +} s_req_list = {0}; + +atomic_int s_req_flag; + +static pthread_mutex_t s_req_list_lock = PTHREAD_MUTEX_INITIALIZER; /* Coordinate access to the req_list */ + +static pthread_mutex_t s_req_list_async_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t s_req_list_async_cond = PTHREAD_COND_INITIALIZER; + +static int s_req_async_proc_stop_flag = 0; + + +static void * s_req_async_proc (void *arg) +{ +int rc, flag; +struct timespec tmo = {0}; + + log_it(L_NOTICE, "Run processor thread ..."); + + while ( !s_req_async_proc_stop_flag ) + { + tmo.tv_sec = time (NULL) + 2; /* Timeout is 2 seconds */ + + if ( ETIMEDOUT == (rc = pthread_mutex_timedlock (&s_req_list_async_lock, &tmo)) ) + { + log_it(L_ERROR, "pthread_mutex_timedlock(req_mutex)->%d, errno=%d", rc, errno); + continue; + } + + flag = atomic_load(&s_req_flag); + + + } + + log_it(L_NOTICE, "Exiting processor thread"); + pthread_exit(NULL); +} + /** * @brief Serialize key and val to a item @@ -233,20 +283,26 @@ ERR: * @brief Initiates a CDB with callback fuctions. * @param a_cdb_path a path to CDB. Saved in s_cdb_path * @param a_drv_callback a struct for callback functions + * @param a_db_drvmode_async * @return 0 if success, -1 if Ñouldn't open db directory, -2 if dap_cdb_init_group() returns NULL. */ -int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_drv_callback) { +int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_drv_callback, + bool a_db_drvmode_async) +{ s_cdb_path = dap_strdup(a_cdb_path); if(s_cdb_path[strlen(s_cdb_path)] == '/') { s_cdb_path[strlen(s_cdb_path)] = '\0'; } + dap_mkdir_with_parents(s_cdb_path); + struct dirent *d; DIR *dir = opendir(s_cdb_path); if (!dir) { log_it(L_ERROR, "Couldn't open db directory"); return -1; } + for (d = readdir(dir); d; d = readdir(dir)) { #ifdef _DIRENT_HAVE_D_TYPE if (d->d_type != DT_DIR) @@ -274,6 +330,9 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_ return -2; } } + + s_db_drvmode_async = a_db_drvmode_async; /* DB Driver mode: Async/Sync */ + a_drv_callback->read_last_store_obj = dap_db_driver_cdb_read_last_store_obj; a_drv_callback->apply_store_obj = dap_db_driver_cdb_apply_store_obj; a_drv_callback->read_store_obj = dap_db_driver_cdb_read_store_obj; @@ -285,6 +344,10 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_ a_drv_callback->flush = dap_db_driver_cdb_flush; closedir(dir); + + + + return CDB_SUCCESS; } @@ -583,7 +646,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { if (!l_cdb_i) { return -1; } - if(a_store_obj->type == 'a') { + if(a_store_obj->type == DAP_DB$K_OPTYPE_ADD) { if(!a_store_obj->key) { return -2; } @@ -616,7 +679,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { } DAP_DELETE(l_rec.key); DAP_DELETE(l_rec.val); - } else if(a_store_obj->type == 'd') { + } else if(a_store_obj->type == DAP_DB$K_OPTYPE_DEL) { if(a_store_obj->key) { if(cdb_del(l_cdb_i->cdb, a_store_obj->key, (int) strlen(a_store_obj->key)) == -3) ret = 1; diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c index 334b0d3fd3ecbbb96f48e884a547040374b983f7..c24f5fc07267168beb10b12656cf372130517868 100644 --- a/modules/global-db/dap_chain_global_db_driver_sqlite.c +++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c @@ -42,8 +42,8 @@ #define LOG_TAG "db_sqlite" struct dap_sqlite_conn_pool_item { - sqlite3 *conn; - int busy; + sqlite3 *conn; + int busy; }; //static sqlite3 *s_db = NULL; @@ -90,57 +90,63 @@ static sqlite3 *s_sqlite_get_connection(void) return s_trans; } - sqlite3 *l_ret = NULL; - for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { - if (!s_conn_pool[i].busy) { - l_ret = s_conn_pool[i].conn; - s_conn_pool[i].busy = 1; - break; - } - } - - pthread_rwlock_unlock(&s_db_rwlock); - return l_ret; + sqlite3 *l_ret = NULL; + for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { + if (!s_conn_pool[i].busy) { + l_ret = s_conn_pool[i].conn; + s_conn_pool[i].busy = 1; + break; + } + } + + pthread_rwlock_unlock(&s_db_rwlock); + return l_ret; } static void s_sqlite_free_connection(sqlite3 *a_conn) { - if (pthread_rwlock_wrlock(&s_db_rwlock) == EDEADLK) { - return; - } - - for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { - if (s_conn_pool[i].conn == a_conn) { - s_conn_pool[i].busy = 0; - break; - } - } - - pthread_rwlock_unlock(&s_db_rwlock); + if (pthread_rwlock_wrlock(&s_db_rwlock) == EDEADLK) { + return; + } + + for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { + if (s_conn_pool[i].conn == a_conn) { + s_conn_pool[i].busy = 0; + break; + } + } + + pthread_rwlock_unlock(&s_db_rwlock); } /** * @brief Initializes a SQLite database. * @note no thread safe * @param a_filename_db a path to the database file - * @param a_drv_callback a pointer to a structure of callback functions + * @param a_drv_callback a pointer to a structure of callback functions * @return If successful returns 0, else a code < 0. */ -int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback) +int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback, + bool db_drvmode_async) { int l_ret = -1; + if(sqlite3_threadsafe() && !sqlite3_config(SQLITE_CONFIG_SERIALIZED)) l_ret = sqlite3_initialize(); + if(l_ret != SQLITE_OK) { log_it(L_ERROR, "Can't init sqlite err=%d (%s)", l_ret, sqlite3_errstr(l_ret)); return -2; } + // Check paths and create them if nessesary char * l_filename_dir = dap_path_get_dirname(a_filename_db); if(!dap_dir_test(l_filename_dir)){ log_it(L_NOTICE, "No directory %s, trying to create...",l_filename_dir); + int l_mkdir_ret = dap_mkdir_with_parents(l_filename_dir); int l_errno = errno; + if(!dap_dir_test(l_filename_dir)){ char l_errbuf[255]; l_errbuf[0] = '\0'; @@ -152,20 +158,21 @@ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks log_it(L_NOTICE,"Directory created"); } DAP_DEL_Z(l_filename_dir); + // Open Sqlite file, create if nessesary char *l_error_message = NULL; - for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { - s_conn_pool[i].conn = dap_db_driver_sqlite_open(a_filename_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, &l_error_message); - if (!s_conn_pool[i].conn) { - log_it(L_ERROR, "Can't init sqlite err: \"%s\"", l_error_message); - dap_db_driver_sqlite_free(l_error_message); - l_ret = -3; - for(int ii = i - 1; ii >= 0; ii--) { - dap_db_driver_sqlite_close(s_conn_pool[ii].conn); - } - goto end; - } - sqlite3 *s_db = s_conn_pool[i].conn; + for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { + s_conn_pool[i].conn = dap_db_driver_sqlite_open(a_filename_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, &l_error_message); + if (!s_conn_pool[i].conn) { + log_it(L_ERROR, "Can't init sqlite err: \"%s\"", l_error_message); + dap_db_driver_sqlite_free(l_error_message); + l_ret = -3; + for(int ii = i - 1; ii >= 0; ii--) { + dap_db_driver_sqlite_close(s_conn_pool[ii].conn); + } + goto end; + } + sqlite3 *s_db = s_conn_pool[i].conn; if(!dap_db_driver_sqlite_set_pragma(s_db, "synchronous", "NORMAL")) // 0 | OFF | 1 | NORMAL | 2 | FULL printf("can't set new synchronous mode\n"); if(!dap_db_driver_sqlite_set_pragma(s_db, "journal_mode", "OFF")) // DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF @@ -173,8 +180,8 @@ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks if(!dap_db_driver_sqlite_set_pragma(s_db, "page_size", "1024")) // DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF printf("can't set page_size\n"); - s_conn_pool[i].busy = 0; - } + s_conn_pool[i].busy = 0; + } // *PRAGMA page_size = bytes; // page size DB; it is reasonable to make it equal to the size of the disk cluster 4096 // *PRAGMA cache_size = -kibibytes; // by default it is equal to 2000 pages of database @@ -197,18 +204,18 @@ end: /** * @brief Deinitializes a SQLite database. - * + * * @return Returns 0 if successful. */ int dap_db_driver_sqlite_deinit(void) { pthread_rwlock_wrlock(&s_db_rwlock); - for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { - if (s_conn_pool[i].conn) { - dap_db_driver_sqlite_close(s_conn_pool[i].conn); - s_conn_pool[i].busy = 0; - } - } + for (int i = 0; i < DAP_SQLITE_POOL_COUNT; i++) { + if (s_conn_pool[i].conn) { + dap_db_driver_sqlite_close(s_conn_pool[i].conn); + s_conn_pool[i].busy = 0; + } + } pthread_rwlock_unlock(&s_db_rwlock); //s_db = NULL; return sqlite3_shutdown(); @@ -232,7 +239,7 @@ static void byte_to_bin(sqlite3_context *l_context, int a_argc, sqlite3_value ** /** * @brief Opens a SQLite database and adds byte_to_bin function. - * + * * @param a_filename_utf8 a SQLite database file name * @param a_flags database access flags (SQLITE_OPEN_READONLY, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) * @param a_error_message[out] an error message that's received from the SQLite database @@ -266,7 +273,7 @@ sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, cha /** * @brief Closes a SQLite database. - * + * * @param l_db a pointer to an instance of SQLite database structure * @return (none) */ @@ -278,7 +285,7 @@ void dap_db_driver_sqlite_close(sqlite3 *l_db) /** * @brief Releases memory allocated by sqlite3_mprintf() - * + * * @param memory a pointer to a string * @return (none) */ @@ -290,7 +297,7 @@ void dap_db_driver_sqlite_free(char *memory) /** * @brief Executes a PRAGMA statement. - * + * * @param a_db a pointer to an instance of SQLite database structure * @param a_param a PRAGMA name * @param a_mode a PRAGMA value @@ -314,13 +321,13 @@ bool dap_db_driver_sqlite_set_pragma(sqlite3 *a_db, char *a_param, char *a_mode) /** * @brief Flushes a SQLite database cahce to disk. * @note The function closes and opens the database - * + * * @return Returns 0 if successful. */ int dap_db_driver_sqlite_flush() { log_it(L_DEBUG, "Start flush sqlite data base."); - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); if(!s_db){ return -666; } @@ -347,7 +354,7 @@ int dap_db_driver_sqlite_flush() /** * @brief Executes SQL statements. - * + * * @param l_db a pointer to an instance of SQLite database structure * @param l_query the SQL statement * @param l_error_message[out] an error message that's received from the SQLite database @@ -373,13 +380,13 @@ static int dap_db_driver_sqlite_exec(sqlite3 *l_db, const char *l_query, char ** /** * @brief Creates a table and unique index in the s_db database. - * + * * @param a_table_name a table name string * @return Returns 0 if successful, otherwise -1. */ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name) { - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); char *l_error_message = NULL; if(!s_db || !a_table_name) return -1; @@ -392,7 +399,7 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name) log_it(L_ERROR, "Creatу_table : %s\n", l_error_message); dap_db_driver_sqlite_free(l_error_message); DAP_DELETE(l_query); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return -1; } DAP_DELETE(l_query); @@ -403,11 +410,11 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name) log_it(L_ERROR, "Create unique index : %s\n", l_error_message); dap_db_driver_sqlite_free(l_error_message); DAP_DELETE(l_query); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return -1; } DAP_DELETE(l_query); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return 0; } @@ -417,7 +424,7 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name) * @param query the query * @param l_res[out] a pointer to a pointer to a structure with result * @param l_error_message[out] an error message that's received from the SQLite database - * @return Returns 0 if successful, + * @return Returns 0 if successful, */ static int dap_db_driver_sqlite_query(sqlite3 *db, char *query, sqlite3_stmt **l_res, char **l_error_message) { @@ -438,7 +445,7 @@ static int dap_db_driver_sqlite_query(sqlite3 *db, char *query, sqlite3_stmt **l /** * @brief Releases memory allocated for a row. - * + * * @param row a database row * @return (none) */ @@ -455,7 +462,7 @@ static void dap_db_driver_sqlite_row_free(SQLITE_ROW_VALUE *row) /** * @brief Fetches a result values from a query to l_row_out - * + * * @param l_res a pointer to a prepared statement structure * @param l_row_out a pointer to a pointer to a row structure * @return Returns SQLITE_ROW(100) or SQLITE_DONE(101) or SQLITE_BUSY(5) @@ -508,7 +515,7 @@ static int dap_db_driver_sqlite_fetch_array(sqlite3_stmt *l_res, SQLITE_ROW_VALU /** * @brief Destroys a prepared statement structure - * + * * @param l_res a pointer to the statement structure * @return Returnes true if successful, otherwise false. */ @@ -524,7 +531,7 @@ static bool dap_db_driver_sqlite_query_free(sqlite3_stmt *l_res) /** * @brief Convers a byte array into a hexadecimal string - * + * * @param blob a byte array * @param len a length of byte array * @return Returns a hexadecimal string @@ -545,7 +552,7 @@ static char* dap_db_driver_get_string_from_blob(uint8_t *blob, int len) /** * @brief Executes a VACUUM statement in a database. - * + * * @param l_db a a pointer to an instance of SQLite database structure * @return Returns 0 if successful. */ @@ -559,12 +566,12 @@ int dap_db_driver_sqlite_vacuum(sqlite3 *l_db) /** * @brief Starts a transaction in s_db database. - * + * * @return Returns 0 if successful, otherwise -1. */ int dap_db_driver_sqlite_start_transaction(void) { - s_trans = s_sqlite_get_connection(); + s_trans = s_sqlite_get_connection(); pthread_rwlock_wrlock(&s_db_rwlock); if(!s_trans){ pthread_rwlock_unlock(&s_db_rwlock); @@ -582,7 +589,7 @@ int dap_db_driver_sqlite_start_transaction(void) /** * @brief Ends a transaction in s_db database. - * + * * @return Returns 0 if successful, otherwise -1. */ int dap_db_driver_sqlite_end_transaction(void) @@ -603,7 +610,7 @@ int dap_db_driver_sqlite_end_transaction(void) /** * @brief Replaces '_' char with '.' char in a_table_name. - * + * * @param a_table_name a table name string * @return Returns a group name string with the replaced character */ @@ -625,7 +632,7 @@ char *dap_db_driver_sqlite_make_group_name(const char *a_table_name) /** * @brief Replaces '.' char with '_' char in a_group_name. - * + * * @param a_group_name a group name string * @return Returns a table name string with the replaced character */ @@ -647,7 +654,7 @@ char *dap_db_driver_sqlite_make_table_name(const char *a_group_name) /** * @brief Applies an object to a database. - * + * * @param a_store_obj a pointer to the object structure * @return Returns 0 if successful. */ @@ -658,7 +665,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) char *l_query = NULL; char *l_error_message = NULL; char *l_table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group); - if(a_store_obj->type == 'a') { + if(a_store_obj->type == DAP_DB$K_OPTYPE_ADD) { if(!a_store_obj->key) return -1; char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len); @@ -668,7 +675,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) l_table_name, a_store_obj->key, a_store_obj->timestamp, l_blob_value); dap_db_driver_sqlite_free(l_blob_value); } - else if (a_store_obj->type == 'd') { + else if (a_store_obj->type == DAP_DB$K_OPTYPE_DEL) { //delete one record if (a_store_obj->key) { l_query = sqlite3_mprintf("delete from '%s' where key = '%s'", @@ -683,7 +690,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) return -1; } // execute request - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); if(!s_db){ return -666; } @@ -720,7 +727,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) dap_db_driver_sqlite_free(l_error_message); l_ret = -1; } - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); if (a_store_obj->key) DAP_DELETE(a_store_obj->key); dap_db_driver_sqlite_free(l_query); @@ -730,7 +737,7 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) /** * @brief Fills a object from a row - * + * * @param a_group a group name string * @param a_obj a pointer to the object * @param a_row a ponter to the row structure @@ -769,7 +776,7 @@ static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_RO /** * @brief Reads a last object from the s_db database. - * + * * @param a_group a group name string * @return Returns a pointer to the object. */ @@ -783,7 +790,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group) return NULL; char * l_table_name = dap_db_driver_sqlite_make_table_name(a_group); char *l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' ORDER BY id DESC LIMIT 1", l_table_name); - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); if(!s_db){ return NULL; } @@ -794,7 +801,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group) if(l_ret != SQLITE_OK) { //log_it(L_ERROR, "read last l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); dap_db_driver_sqlite_free(l_error_message); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return NULL; } @@ -811,19 +818,19 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group) dap_db_driver_sqlite_row_free(l_row); dap_db_driver_sqlite_query_free(l_res); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return l_obj; } /** * @brief Reads some objects from a database by conditions - * + * * @param a_group a group name string * @param a_id id * @param a_count_out[in] a number of objects to be read, if equals 0 reads with no limits - * @param a_count_out[out] a number of objects that were read - * @return If successful, a pointer to an objects, otherwise NULL. + * @param a_count_out[out] a number of objects that were read + * @return If successful, a pointer to an objects, otherwise NULL. */ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, uint64_t a_id, size_t *a_count_out) { @@ -846,9 +853,9 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' WHERE id>='%lld' ORDER BY id ASC", l_table_name, a_id); } - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); if(!s_db){ - if (l_str_query) sqlite3_free(l_str_query); + if (l_str_query) sqlite3_free(l_str_query); return NULL; } @@ -859,7 +866,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u if(l_ret != SQLITE_OK) { //log_it(L_ERROR, "read l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); dap_db_driver_sqlite_free(l_error_message); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return NULL; } @@ -889,7 +896,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u } while(l_row); dap_db_driver_sqlite_query_free(l_res); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); if(a_count_out) *a_count_out = (size_t)l_count_out; @@ -907,7 +914,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u */ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const char *a_key, size_t *a_count_out) { - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); if(!a_group || !s_db) return NULL; dap_store_obj_t *l_obj = NULL; @@ -940,7 +947,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const DAP_DEL_Z(l_table_name); if(l_ret != SQLITE_OK) { //log_it(L_ERROR, "read l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return NULL; } @@ -970,7 +977,7 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const } while(l_row); dap_db_driver_sqlite_query_free(l_res); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); if(a_count_out) *a_count_out = l_count_out; @@ -979,13 +986,13 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const /** * @brief Gets a list of group names from a s_db database by a_group_mask. - * + * * @param a_group_mask a group name mask * @return Returns a pointer to a list of group names. */ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask) { - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); if(!a_group_mask || !s_db) return NULL; sqlite3_stmt *l_res; @@ -994,7 +1001,7 @@ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask) int l_ret = dap_db_driver_sqlite_query(s_db, (char *)l_str_query, &l_res, NULL); if(l_ret != SQLITE_OK) { //log_it(L_ERROR, "Get tables l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return NULL; } char * l_mask = dap_db_driver_sqlite_make_table_name(a_group_mask); @@ -1007,21 +1014,21 @@ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask) } dap_db_driver_sqlite_query_free(l_res); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return l_ret_list; } /** * @brief Reads a number of objects from a s_db database by a_group and a_id - * + * * @param a_group a group name string * @param a_id id starting from which the quantity is calculated * @return Returns a number of objects. */ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id) { - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); sqlite3_stmt *l_res; if(!a_group || ! s_db) return 0; @@ -1034,7 +1041,7 @@ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id) if(l_ret != SQLITE_OK) { //log_it(L_ERROR, "Count l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return 0; } size_t l_ret_val = 0; @@ -1045,21 +1052,21 @@ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id) } dap_db_driver_sqlite_query_free(l_res); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return l_ret_val; } /** * @brief Checks if an object is in a s_db database by a_group and a_key. - * + * * @param a_group a group name string * @param a_key a object key string * @return Returns true if it is, false it's not. */ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key) { - sqlite3 *s_db = s_sqlite_get_connection(); + sqlite3 *s_db = s_sqlite_get_connection(); sqlite3_stmt *l_res; if(!a_group || ! s_db) return false; @@ -1072,7 +1079,7 @@ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key) if(l_ret != SQLITE_OK) { //log_it(L_ERROR, "Exists l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return false; } bool l_ret_val = false; @@ -1083,7 +1090,7 @@ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key) } dap_db_driver_sqlite_query_free(l_res); - s_sqlite_free_connection(s_db); + s_sqlite_free_connection(s_db); return l_ret_val; } diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index 53bec9f4efe378aa2e0f7f0d0544b9178cdcf544..e2e4729888fa2aed4f9f0c7bf574033ff0943f96 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -22,25 +22,25 @@ */ static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name, time_t a_expire_time) { +char l_key [DAP_DB_K_MAXKEYLEN]; +bool l_ret; + if(!a_net_name) return false; - char *l_key = dap_strdup_printf("cur_node_addr_%s", a_net_name); - uint64_t * l_address = DAP_NEW_Z(uint64_t); - *l_address = a_address; - bool l_ret = dap_chain_global_db_gr_set(l_key, (uint8_t*) l_address, sizeof(a_address), GROUP_LOCAL_GENERAL); - //DAP_DELETE(l_key); - if(l_ret) { - time_t *l_cur_time = DAP_NEW_Z(time_t); - *l_cur_time= a_expire_time; - char *l_key_time = dap_strdup_printf("cur_node_addr_%s_time", a_net_name); - l_ret = dap_chain_global_db_gr_set(l_key_time, (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL); + + dap_snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name); + + if ( !(l_ret = dap_chain_global_db_gr_set(l_key, &a_address, sizeof(a_address), GROUP_LOCAL_GENERAL)) ) { + dap_snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s_time", a_net_name); + l_ret = dap_chain_global_db_gr_set(l_key, &a_expire_time, sizeof(time_t), GROUP_LOCAL_GENERAL); } + return l_ret; } /** * @brief Sets an adress of a current node and no expire time. - * + * * @param a_address an adress of a current node * @param a_net_name a net name string * @return Returns true if siccessful, otherwise false @@ -52,7 +52,7 @@ bool dap_db_set_cur_node_addr(uint64_t a_address, char *a_net_name ) /** * @brief Sets an adress of a current node and expire time. - * + * * @param a_address an adress of a current node * @param a_net_name a net name string * @return Returns true if siccessful, otherwise false @@ -65,32 +65,45 @@ bool dap_db_set_cur_node_addr_exp(uint64_t a_address, char *a_net_name ) /** * @brief Gets an adress of current node by a net name. - * + * * @param a_net_name a net name string * @return Returns an adress if successful, otherwise 0. */ uint64_t dap_db_get_cur_node_addr(char *a_net_name) { +char l_key[DAP_DB_K_MAXKEYLEN], l_key_time[DAP_DB_K_MAXKEYLEN]; +uint8_t *l_node_addr_data, *l_node_time_data; size_t l_node_addr_len = 0, l_node_time_len = 0; +uint64_t l_node_addr_ret = 0; +time_t l_node_time = 0; + if(!a_net_name) return 0; - char *l_key = dap_strdup_printf("cur_node_addr_%s", a_net_name); - char *l_key_time = dap_strdup_printf("cur_node_addr_%s_time", a_net_name); - uint8_t *l_node_addr_data = dap_chain_global_db_gr_get(l_key, &l_node_addr_len, GROUP_LOCAL_GENERAL); - uint8_t *l_node_time_data = dap_chain_global_db_gr_get(l_key_time, &l_node_time_len, GROUP_LOCAL_GENERAL); - uint64_t l_node_addr_ret = 0; - time_t l_node_time = 0; + + dap_snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name); + dap_snprintf(l_key_time, sizeof(l_key_time) - 1, "cur_node_addr_%s_time", a_net_name); + + l_node_addr_data = dap_chain_global_db_gr_get(l_key, &l_node_addr_len, GROUP_LOCAL_GENERAL); + l_node_time_data = dap_chain_global_db_gr_get(l_key_time, &l_node_time_len, GROUP_LOCAL_GENERAL); + if(l_node_addr_data && l_node_addr_len == sizeof(uint64_t)) - memcpy(&l_node_addr_ret, l_node_addr_data, l_node_addr_len); + l_node_addr_ret = *( (uint64_t *) l_node_addr_data ); + if(l_node_time_data && l_node_time_len == sizeof(time_t)) - memcpy(&l_node_time, l_node_time_data, l_node_time_len); + l_node_time = *( (time_t *) l_node_time_data ); + + DAP_DELETE(l_node_addr_data); + DAP_DELETE(l_node_time_data); + // time delta in seconds static int64_t addr_time_expired = -1; // read time-expired + if(addr_time_expired == -1) { dap_string_t *l_cfg_path = dap_string_new("network/"); dap_string_append(l_cfg_path, a_net_name); dap_config_t *l_cfg; + if((l_cfg = dap_config_open(l_cfg_path->str)) == NULL) { log_it(L_ERROR, "Can't open default network config"); addr_time_expired = 0; @@ -101,21 +114,19 @@ uint64_t dap_db_get_cur_node_addr(char *a_net_name) } dap_string_free(l_cfg_path, true); } + time_t l_dt = time(NULL) - l_node_time; //NODE_TIME_EXPIRED if(l_node_time && l_dt > addr_time_expired) { l_node_addr_ret = 0; } - DAP_DELETE(l_key); - DAP_DELETE(l_key_time); - DAP_DELETE(l_node_addr_data); - DAP_DELETE(l_node_time_data); + return l_node_addr_ret; } /** * @brief Sets last id of a remote node. - * + * * @param a_node_addr a node adress * @param a_id id * @param a_group a group name string @@ -123,18 +134,15 @@ uint64_t dap_db_get_cur_node_addr(char *a_net_name) */ bool dap_db_set_last_id_remote(uint64_t a_node_addr, uint64_t a_id, char *a_group) { - //log_it( L_DEBUG, "Node 0x%016X set last synced id %"DAP_UINT64_FORMAT_U"", a_node_addr, a_id); - char *l_node_addr_str = dap_strdup_printf("%ju%s", a_node_addr, a_group); - uint64_t *l_id = DAP_NEW(uint64_t); - *l_id = a_id; - bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, l_id, sizeof(uint64_t), - GROUP_LOCAL_NODE_LAST_ID); - return l_ret; +char l_key[DAP_DB_K_MAXKEYLEN]; + + dap_snprintf(l_key, sizeof(l_key) - 1, "%ju%s", a_node_addr, a_group); + return dap_chain_global_db_gr_set(l_key, &a_id, sizeof(uint64_t), GROUP_LOCAL_NODE_LAST_ID); } /** * @brief Gets last id of a remote node. - * + * * @param a_node_addr a node adress * @param a_group a group name string * @return Returns id if successful, otherwise 0. @@ -157,22 +165,24 @@ uint64_t dap_db_get_last_id_remote(uint64_t a_node_addr, char *a_group) /** * @brief Sets the last hash of a remote node. - * + * * @param a_node_addr a node adress * @param a_chain a pointer to the chain stucture - * @param a_hash a - * @return true - * @return false + * @param a_hash a + * @return true + * @return false */ bool dap_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash) { - return dap_chain_global_db_gr_set(dap_strdup_printf("%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name), - DAP_DUP(a_hash), sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID); +char l_key[DAP_DB_K_MAXKEYLEN]; + + dap_snprintf(l_key, sizeof(l_key) - 1, "%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name); + return dap_chain_global_db_gr_set(l_key, a_hash, sizeof(dap_chain_hash_fast_t), GROUP_LOCAL_NODE_LAST_ID); } /** * @brief Gets the last hash of a remote node. - * + * * @param a_node_addr a node adress * @param a_chain a pointer to a chain structure * @return Returns a hash if successful. @@ -189,7 +199,7 @@ dap_chain_hash_fast_t *dap_db_get_last_hash_remote(uint64_t a_node_addr, dap_cha /** * @brief Gets a size of an object. - * + * * @param store_obj a pointer to the object * @return Returns the size. */ @@ -204,7 +214,7 @@ static size_t dap_db_get_size_pdap_store_obj_t(pdap_store_obj_t store_obj) /** * @brief Multiples data into a_old_pkt structure from a_new_pkt structure. * @param a_old_pkt a pointer to the old object - * @param a_new_pkt a pointer to the new object + * @param a_new_pkt a pointer to the new object * @return Returns a pointer to the multiple object */ dap_store_obj_pkt_t *dap_store_packet_multiple(dap_store_obj_pkt_t *a_old_pkt, dap_store_obj_pkt_t *a_new_pkt) @@ -224,7 +234,7 @@ dap_store_obj_pkt_t *dap_store_packet_multiple(dap_store_obj_pkt_t *a_old_pkt, d /** * @brief Changes id in a packed structure. - * + * * @param a_pkt a pointer to the packed structure * @param a_id id * @return (none) diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h index 98129b6a05c45f107c2bd08fdcc747527afdc470..d8f7705fd31a4c4d686dce2abbf9933ce04f91a3 100644 --- a/modules/global-db/include/dap_chain_global_db.h +++ b/modules/global-db/include/dap_chain_global_db.h @@ -26,6 +26,11 @@ typedef struct dap_global_db_obj { typedef void (*dap_global_db_obj_callback_notify_t) (void * a_arg, const char a_op_code, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len); + +#define DAP_DB_K_MAXKEYLEN 128 /* @RRL: A maximum key's size */ +#define DAP_DB_K_MAXGRPLEN 128 /* @RRL: A maximum group name */ + + /** * Flush DB */ @@ -68,13 +73,13 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out); /** * Set one entry to base */ -bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, const char *a_group); +bool dap_chain_global_db_gr_set(const char *a_key, const void *a_value, size_t a_value_len, const char *a_group); bool dap_chain_global_db_set( char *a_key, void *a_value, size_t a_value_len); /** * Delete entry from base */ -bool dap_chain_global_db_gr_del(char *a_key, const char *a_group); +bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group); bool dap_chain_global_db_del(char *a_key); /** @@ -98,7 +103,7 @@ dap_global_db_obj_t* dap_chain_global_db_load(size_t *a_data_size_out); * * @return */ -bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count); +bool dap_chain_global_db_obj_save(dap_store_obj_t *a_store_data, size_t a_objs_count); bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_count, const char *a_group); bool dap_chain_global_db_save(dap_global_db_obj_t* a_objs, size_t a_objs_count); /** diff --git a/modules/global-db/include/dap_chain_global_db_driver.h b/modules/global-db/include/dap_chain_global_db_driver.h index af3174367a78d9829d843eb7398a8cbff2055337..e9c6670fbf24eb05bf5fcbd301f3998028d04e99 100644 --- a/modules/global-db/include/dap_chain_global_db_driver.h +++ b/modules/global-db/include/dap_chain_global_db_driver.h @@ -29,10 +29,17 @@ #include "dap_common.h" #include "dap_list.h" +enum { + DAP_DB$K_OPTYPE_ADD = 'a', /* Operation Type = INSERT/ADD */ + DAP_DB$K_OPTYPE_DEL = 'd', /* -- // -- DELETE */ + +}; + + typedef struct dap_store_obj { - uint64_t id; + uint64_t id; uint64_t timestamp; - uint8_t type; + uint32_t type; /* Operation type: ADD/DELETE, see DAP_DB$K_OPTYPE_* constants */ char *group; char *key; const char *c_key; @@ -44,7 +51,7 @@ typedef struct dap_store_obj_pkt { uint64_t timestamp; uint64_t data_size; uint32_t obj_count; - uint8_t data[]; + uint8_t data[]; }__attribute__((packed)) dap_store_obj_pkt_t; typedef int (*dap_db_driver_write_callback_t)(dap_store_obj_t*); @@ -71,7 +78,7 @@ typedef struct dap_db_driver_callbacks { } dap_db_driver_callbacks_t; -int dap_db_driver_init(const char *driver_name, const char *a_filename_db); +int dap_db_driver_init(const char *driver_name, const char *a_filename_db, bool a_db_drvmode_async); void dap_db_driver_deinit(void); dap_store_obj_t* dap_store_obj_copy(dap_store_obj_t *a_store_obj, size_t a_store_count); @@ -80,7 +87,7 @@ int dap_db_driver_flush(void); char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size); -int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store_count); +int dap_chain_global_db_driver_apply(pdap_store_obj_t a_store_obj, size_t a_store_count); int dap_chain_global_db_driver_add(pdap_store_obj_t a_store_obj, size_t a_store_count); int dap_chain_global_db_driver_delete(pdap_store_obj_t a_store_obj, size_t a_store_count); dap_store_obj_t* dap_chain_global_db_driver_read_last(const char *a_group); diff --git a/modules/global-db/include/dap_chain_global_db_driver_cdb.h b/modules/global-db/include/dap_chain_global_db_driver_cdb.h index b5011f6bb97ff334629f8b6aa5115b25999d7a4c..891ebbcf0fc917b7b58c8a80ef2b08942684a36c 100644 --- a/modules/global-db/include/dap_chain_global_db_driver_cdb.h +++ b/modules/global-db/include/dap_chain_global_db_driver_cdb.h @@ -38,7 +38,7 @@ typedef struct _cdb_record { char *val; } cdb_record, *pcdb_record; -int dap_db_driver_cdb_init(const char*, dap_db_driver_callbacks_t*); +int dap_db_driver_cdb_init(const char *, dap_db_driver_callbacks_t *, bool); int dap_db_driver_cdb_deinit(); int dap_db_driver_cdb_flush(void); diff --git a/modules/global-db/include/dap_chain_global_db_driver_sqlite.h b/modules/global-db/include/dap_chain_global_db_driver_sqlite.h index aa5e50219b6c86a427b5d4b7ab79dad95ad0ae33..bc3679adbe608e5e0f32a148fb825933c467bf96 100644 --- a/modules/global-db/include/dap_chain_global_db_driver_sqlite.h +++ b/modules/global-db/include/dap_chain_global_db_driver_sqlite.h @@ -29,7 +29,7 @@ #define DAP_SQLITE_POOL_COUNT 16 -int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback); +int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback, bool db_drvmode_async); int dap_db_driver_sqlite_deinit(void); sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, char **error_message); diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 5685e903c6bb026a3d1f3bf19b819f6faaaef9ee..e7080e4b9c1317e9655dbddbe8fcb06b3baba9f6 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -77,24 +77,26 @@ int dap_datum_mempool_init(void) * @param a_datum * @return */ -char *dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum, dap_chain_t * a_chain ) +char *dap_chain_mempool_datum_add(const dap_chain_datum_t * a_datum, const dap_chain_t * a_chain ) { if( a_datum == NULL){ log_it(L_ERROR, "NULL datum trying to add in mempool"); return NULL; } + dap_chain_hash_fast_t l_key_hash; + dap_hash_fast(a_datum->data , a_datum->header.data_size, &l_key_hash); char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain); - if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (byte_t *) a_datum, dap_chain_datum_size(a_datum) - ,l_gdb_group)) { + + if(dap_chain_global_db_gr_set( l_key_str, a_datum, dap_chain_datum_size(a_datum), l_gdb_group)) { log_it(L_NOTICE, "Datum with data's hash %s was placed in mempool", l_key_str); } else { log_it(L_WARNING, "Can't place data's hash %s was placed in mempool", l_key_str); DAP_DELETE(l_key_str); - l_key_str = NULL; } + DAP_DELETE(l_gdb_group); return l_key_str; } @@ -168,11 +170,13 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_ dap_hash_fast(l_tx, l_tx_size, l_ret); DAP_DELETE(l_tx); char *l_hash_str = dap_chain_mempool_datum_add(l_datum, a_chain); + + DAP_DELETE( l_datum ); + if (l_hash_str) { DAP_DELETE(l_hash_str); return l_ret; }else{ - DAP_DELETE( l_datum ); DAP_DELETE(l_ret); return NULL; } @@ -452,10 +456,12 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * else l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type( a_net ,CHAIN_TYPE_TX); - if( dap_chain_global_db_gr_set( dap_strdup(l_key_str), (uint8_t *) l_datum, dap_chain_datum_size(l_datum) - , l_gdb_group ) ) { + if( dap_chain_global_db_gr_set( l_key_str, l_datum, dap_chain_datum_size(l_datum), l_gdb_group ) ) { log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str); + + DAP_DELETE(l_datum); } + DAP_DELETE(l_gdb_group); DAP_DELETE(l_key_str); @@ -623,10 +629,11 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, char * l_key_str = dap_chain_hash_fast_to_str_new( l_key_hash ); char * l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type( a_net ,CHAIN_TYPE_TX); - if( dap_chain_global_db_gr_set( dap_strdup(l_key_str), (uint8_t *) l_datum, dap_chain_datum_size(l_datum) - , l_gdb_group ) ) { + + if( dap_chain_global_db_gr_set( l_key_str, l_datum, dap_chain_datum_size(l_datum), l_gdb_group ) ) { log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str); } + DAP_DELETE(l_gdb_group); DAP_DELETE(l_key_str); @@ -936,7 +943,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) case DAP_DATUM_MEMPOOL_ADD: // add datum in base //a_value = DAP_NEW_Z_SIZE(char, request_size * 2); //bin2hex((char*) a_value, (const unsigned char*) request_str, request_size); - if(dap_chain_global_db_gr_set(dap_strdup(a_key), request_str,(size_t) request_size, + if ( dap_chain_global_db_gr_set(a_key, request_str, request_size, dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool"))) { *return_code = Http_Status_OK; } @@ -955,8 +962,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) DAP_DEL_Z(str); log_it(L_INFO, "Check hash: key=%s result: Present", a_key); } - else - { + else { dg->response = strdup("0"); log_it(L_INFO, "Check hash: key=%s result: Absent", a_key); } @@ -967,14 +973,13 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) case DAP_DATUM_MEMPOOL_DEL: // delete datum in base strcpy(cl_st->reply_mime, "text/text"); - if(dap_chain_global_db_gr_del( dap_strdup(a_key), + if(dap_chain_global_db_gr_del( a_key, dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool"))) { dg->response = strdup("1"); log_it(L_INFO, "Delete hash: key=%s result: Ok", a_key); } - else - { + else { dg->response = strdup("0"); log_it(L_INFO, "Delete hash: key=%s result: False!", a_key); } @@ -991,19 +996,16 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) return; } DAP_DEL_Z(a_key); - } else{ - *return_code = Http_Status_BadRequest; - } + } else *return_code = Http_Status_BadRequest; DAP_DELETE(request_str); } - else - *return_code = Http_Status_BadRequest; + else *return_code = Http_Status_BadRequest; + enc_http_delegate_delete(dg); } - else { - *return_code = Http_Status_Unauthorized; - } + else *return_code = Http_Status_Unauthorized; + if(hdr_session_close_id && hdr_session_close_id->value && !strcmp(hdr_session_close_id->value, "yes")) { // close session if(hdr_key_id && hdr_key_id->value) { diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index 631459d42c9959e90e2884f7b14942945313f5be..56dc212e3eb3957c3e1065f27a5bade5cac5f6e4 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -43,7 +43,7 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum); void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url); -char *dap_chain_mempool_datum_add(dap_chain_datum_t *a_datum, dap_chain_t *a_chain); +char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, const dap_chain_t *a_chain); dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, const dap_chain_addr_t* a_addr_fee, diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index dceb80d9a3b1ba45116b8ef0c81d7620ef182637..edb8e96262f4b8573b28eb96314ef8dae0599cf0 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -316,9 +316,9 @@ int dap_chain_net_init() /** * @brief get certificate hash from chain config [acl_accept_ca_gdb] param - * + * * @param a_net dap_chain_net_t chain object - * @return char* + * @return char* */ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net) { @@ -338,9 +338,9 @@ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net) /** * @brief convert dap_chain_net_state_t net state object to string - * + * * @param l_state dap_chain_net_state_t - * @return const char* + * @return const char* */ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state) { @@ -349,10 +349,10 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state) /** * @brief set current network state to F_DAP_CHAIN_NET_GO_SYNC - * + * * @param a_net dap_chain_net_t network object * @param a_new_state dap_chain_net_state_t new network state - * @return int + * @return int */ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state) { @@ -384,7 +384,7 @@ dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net) /** * @brief set s_srv_callback_notify - * + * * @param a_callback dap_global_db_obj_callback_notify_t callback function */ void dap_chain_net_add_notify_callback(dap_chain_net_t *a_net, dap_global_db_obj_callback_notify_t a_callback) @@ -411,20 +411,20 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; if (PVT(l_net)->state == NET_STATE_ONLINE) { char *l_group; - if (a_op_code == 'd') { + if (a_op_code == DAP_DB$K_OPTYPE_DEL ) { l_group = dap_strdup_printf("%s.del", a_group); } else { l_group = (char *)a_group; } dap_store_obj_t *l_obj = (dap_store_obj_t *)dap_chain_global_db_obj_get(a_key, l_group); - if (a_op_code == 'd') { + if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) { DAP_DELETE(l_group); } if (!l_obj) { log_it(L_DEBUG, "Notified GDB event does not exist"); return; } - l_obj->type = (uint8_t)a_op_code; + l_obj->type = a_op_code; DAP_DELETE(l_obj->group); l_obj->group = dap_strdup(a_group); dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj); @@ -432,7 +432,7 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {}; dap_chain_cell_id_t l_cell_id = l_chain ? l_chain->cells->id : (dap_chain_cell_id_t){}; - pthread_rwlock_rdlock(&PVT(l_net)->rwlock); + pthread_rwlock_rdlock(&PVT(l_net)->rwlock); for (dap_list_t *l_tmp = PVT(l_net)->net_links; l_tmp; l_tmp = dap_list_next(l_tmp)) { dap_chain_node_client_t *l_node_client = ((struct net_link *)l_tmp->data)->link; if (!l_node_client) @@ -451,7 +451,7 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c /** * @brief added like callback in dap_chain_global_db_add_sync_group - * + * * @param a_arg arguments. Can be network object (dap_chain_net_t) * @param a_op_code object type (f.e. l_net->type from dap_store_obj) * @param a_group group, for example "chain-gdb.home21-network.chain-F" @@ -714,7 +714,7 @@ static void s_node_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_chain_node_cl */ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_client, void *a_arg) -{ +{ dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); pthread_rwlock_wrlock(&l_net_pvt->rwlock); @@ -1064,7 +1064,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); l_link_node_info->hdr.address.uint64 = l_net_pvt->gdb_sync_nodes_addrs[i].uint64; l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->gdb_sync_nodes_links_ips[i]; - l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i]; + l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i]; struct net_link *l_new_link = DAP_NEW_Z(struct net_link); l_new_link->link_info = l_link_node_info; l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link); @@ -1076,7 +1076,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, &l_net_pvt->node_info->links[i]); if (!l_link_node_info || l_link_node_info->hdr.address.uint64 == l_own_addr) { continue; // Do not link with self - } + } struct net_link *l_new_link = DAP_NEW_Z(struct net_link); l_new_link->link_info = l_link_node_info; l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link); @@ -1106,7 +1106,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NODE_ROLE_FULL: case NODE_ROLE_MASTER: case NODE_ROLE_LIGHT: - default: { + default: { if (!l_net_pvt->seed_aliases_count && ! l_net_pvt->bootstrap_nodes_count) { log_it(L_ERROR, "No root servers present in configuration file. Can't establish DNS requests"); if (l_net_pvt->net_links) { // We have other links @@ -1230,7 +1230,7 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t * pthread_rwlock_rdlock(&l_net_pvt->rwlock); if (!a_client || l_net_pvt->active_link == a_client) l_net_pvt->active_link = NULL; - pthread_rwlock_unlock(&l_net_pvt->rwlock); + pthread_rwlock_unlock(&l_net_pvt->rwlock); while (l_net_pvt->active_link == NULL && l_net_pvt->links_queue) { dap_events_socket_uuid_t *l_uuid = l_net_pvt->links_queue->data; dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid); @@ -1289,10 +1289,10 @@ dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net) /** * @brief set node role * [root_master, root, archive, cell_master, master, full, light] - * @param a_id - * @param a_name - * @param a_node_role - * @return dap_chain_net_t* + * @param a_id + * @param a_name + * @param a_node_role + * @return dap_chain_net_t* */ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name , const char * a_node_role) @@ -1371,7 +1371,7 @@ void dap_chain_net_delete( dap_chain_net_t * a_net ) /** - * @brief + * @brief * load network config settings */ void dap_chain_net_load_all() @@ -1766,7 +1766,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Database ACL group not defined for this network"); return -11; } - ret = dap_chain_global_db_gr_set(dap_strdup(l_hash_hex_str), (void *)&c, 1, dap_chain_net_get_gdb_group_acl(l_net)); + ret = dap_chain_global_db_gr_set(l_hash_hex_str, &c, 1, dap_chain_net_get_gdb_group_acl(l_net)); DAP_DELETE(l_gdb_group_str); DAP_DELETE(l_hash_hex_str); if (!ret) { @@ -1804,7 +1804,8 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Database ACL group not defined for this network"); return -11; } - ret = dap_chain_global_db_gr_del((char *)l_hash_string, l_gdb_group_str); + ret = dap_chain_global_db_gr_del(l_hash_string, l_gdb_group_str); + DAP_DELETE(l_hash_string); DAP_DELETE(l_gdb_group_str); if (!ret) { dap_chain_node_cli_set_reply_text(a_str_reply, "Cant't find certificate public key hash in database"); @@ -1870,10 +1871,10 @@ static int callback_compare_prioritity_list(const void * a_item1, const void * a /** * @brief load network config settings from cellframe-node.cfg file - * + * * @param a_net_name const char *: network name, for example "home21-network" * @param a_acl_idx currently 0 - * @return int + * @return int */ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) { @@ -2050,7 +2051,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size); // save pub key if(l_pub_key_data && l_pub_key_data_size > 0) - dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), DAP_DUP_SIZE(l_pub_key_data, l_pub_key_data_size), l_pub_key_data_size, + dap_chain_global_db_gr_set( "cur-node-addr-pkey", l_pub_key_data, l_pub_key_data_size, GROUP_LOCAL_NODE_ADDR); } } @@ -2131,9 +2132,9 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_node_info->hdr.address.uint64 = l_seed_node_addr->uint64; if ( l_node_info->hdr.ext_addr_v4.s_addr || #ifdef DAP_OS_BSD - l_node_info->hdr.ext_addr_v6.__u6_addr.__u6_addr32[0] + l_node_info->hdr.ext_addr_v6.__u6_addr.__u6_addr32[0] #else - l_node_info->hdr.ext_addr_v6.s6_addr32[0] + l_node_info->hdr.ext_addr_v6.s6_addr32[0] #endif ){ int l_ret; @@ -2507,11 +2508,13 @@ dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const ch dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type) { dap_chain_t * l_chain; + if(!l_net) return NULL; + DL_FOREACH(l_net->pub.chains, l_chain) { - for(uint16_t i = 0; i < l_chain->datum_types_count; i++) { + for(int i = 0; i < l_chain->datum_types_count; i++) { if(l_chain->datum_types[i] == a_datum_type) return l_chain; } @@ -2531,7 +2534,7 @@ char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net return NULL; DL_FOREACH(l_net->pub.chains, l_chain) { - for(uint16_t i = 0; i < l_chain->datum_types_count; i++) { + for(int i = 0; i < l_chain->datum_types_count; i++) { if(l_chain->datum_types[i] == a_datum_type) return dap_chain_net_get_gdb_group_mempool(l_chain); } @@ -2713,7 +2716,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net) if (l_verify_datum != 0){ log_it(L_WARNING, "Datum doesn't pass verifications (code %d), delete such datum from pool", l_verify_datum); - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + dap_chain_global_db_gr_del( l_objs[i].key, l_gdb_group_mempool); l_datums[i] = NULL; }else{ l_datums[i] = l_datum; @@ -2732,7 +2735,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++) { - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool); if(i < l_objs_processed_tmp) { dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n", l_objs[i].key); @@ -2880,7 +2883,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu if ( dap_chain_datum_token_is_old(l_token->type) ) dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply ); else - dap_string_append_printf(a_str_out, "total_supply: %s\n", + dap_string_append_printf(a_str_out, "total_supply: %s\n", dap_chain_balance_print(l_token->header_private.total_supply_256)); }break; case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: @@ -3095,7 +3098,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str ); } break; case TX_ITEM_TYPE_OUT_256: { // 256 - dap_string_append_printf(a_str_out,"\tvalue: %s\n", + dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_balance_print(((dap_chain_256_tx_out_t *)l_cur->data)->header.value) ); char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_t *)l_cur->data)->addr ); @@ -3251,11 +3254,11 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu /** * @brief check certificate access list, written in chain config - * + * * @param a_net - network object * @param a_pkey_hash - certificate hash - * @return true - * @return false + * @return true + * @return false */ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pkey_hash) { @@ -3321,7 +3324,7 @@ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pke * @brief s_acl_callback function. Usually called from enc_http_proc * set acl (l_enc_key_ks->acl_list) from acl_accept_ca_list, acl_accept_ca_gdb chain config parameters in [auth] section * @param a_pkey_hash dap_chain_hash_fast_t hash object - * @return uint8_t* + * @return uint8_t* */ static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash) { diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index f5e31813c9322d7f554410cae2c1a3bd61c197b7..4d42872cab655ccacc72f3dd0863d0295d19ef68 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -83,8 +83,7 @@ bool dap_chain_node_check_addr(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_ */ bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr) { - return dap_chain_global_db_gr_set( dap_strdup(a_alias), DAP_DUP(a_addr), - sizeof(dap_chain_node_addr_t), a_net->pub.gdb_nodes_aliases); + return dap_chain_global_db_gr_set( a_alias, a_addr, sizeof(dap_chain_node_addr_t), a_net->pub.gdb_nodes_aliases); } /** @@ -105,9 +104,7 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const */ bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias) { - char *a_key = strdup(a_alias); - bool res = dap_chain_global_db_gr_del(a_key, a_net->pub.gdb_nodes_aliases); - return res; + return dap_chain_global_db_gr_del(a_alias, a_net->pub.gdb_nodes_aliases); } /** @@ -139,7 +136,10 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n } //char *a_value = dap_chain_node_info_serialize(node_info, NULL); size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info); - bool res = dap_chain_global_db_gr_set(l_key, DAP_DUP(a_node_info), l_node_info_size, a_net->pub.gdb_nodes); + bool res = dap_chain_global_db_gr_set(l_key, a_node_info, l_node_info_size, a_net->pub.gdb_nodes); + + DAP_DELETE(l_key); + return res ? 0 : -3; } @@ -172,11 +172,6 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha return NULL; } -// dap_chain_node_info_t *node_info = dap_chain_node_info_deserialize(str, (str) ? strlen(str) : 0); -// if(!node_info) { -// set_reply_text(str_reply, "node has invalid format in base"); -// } -// DAP_DELETE(str); DAP_DELETE(l_key); return l_node_info; } @@ -284,7 +279,7 @@ bool dap_chain_node_mempool_autoproc_init() dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) { // Delete processed objects - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + dap_chain_global_db_gr_del( l_objs[i].key, l_gdb_group_mempool); } } dap_chain_global_db_objs_delete(l_objs, l_objs_size); @@ -324,7 +319,7 @@ void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, c if (!strcmp(a_group, l_gdb_group_str)) { dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value; if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) { - dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str); + dap_chain_global_db_gr_del( a_key, l_gdb_group_str); } } DAP_DELETE(l_gdb_group_str); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 283135d76cb6be487b33d4bbd7ee657288e0c604..5b8d322be06eea040036399ff0a65ce263b4bbe1 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -186,9 +186,9 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) /** * @brief s_node_client_connected_synchro_start_callback - * + * * @param a_worker dap_worker_t - * @param a_arg void + * @param a_arg void */ static void s_node_client_connected_synchro_start_callback(dap_worker_t *a_worker, void *a_arg) { @@ -557,10 +557,10 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch /** * @brief save_stat_to_database - * - * @param a_request - * @param a_node_client - * @return int + * + * @param a_request + * @param a_node_client + * @return int */ static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_request, dap_chain_node_client_t * a_node_client) { @@ -597,7 +597,7 @@ static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_reque l_key = strtoll(l_obj->key, NULL, 16); } char *l_key_str = dap_strdup_printf("%06x", ++l_key); - if(!dap_chain_global_db_gr_set(dap_strdup(l_key_str), dap_strdup(json_str), strlen(json_str) + 1, l_group)) { + if(!dap_chain_global_db_gr_set(l_key_str, json_str, strlen(json_str) + 1, l_group)) { l_ret = -1; } DAP_DELETE(l_key_str); @@ -644,16 +644,16 @@ static void s_ch_chain_callback_notify_packet_R(dap_stream_ch_chain_net_srv_t* a break; default: break; - } + } } /** * @brief dap_chain_node_client_connect_channels * Create connection to server - * @param l_net - * @param a_node_info - * @param a_active_channels + * @param l_net + * @param a_node_info + * @param a_active_channels * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error */ dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * l_net, dap_chain_node_info_t *a_node_info, const char *a_active_channels) @@ -715,8 +715,8 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t * Create new dap_client, setup it, and send it in adventure trip * @param a_node_client dap_chain_node_client_t * @param a_active_channels a_active_channels - * @return true - * @return false + * @return true + * @return false */ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels) { @@ -754,8 +754,8 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no /** * @brief dap_chain_node_client_connect * Create connection to server - * @param a_net - * @param a_node_info + * @param a_net + * @param a_node_info * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error */ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net,dap_chain_node_info_t *a_node_info) @@ -766,7 +766,7 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net,d /** * @brief dap_chain_node_client_reset - * + * * @param a_client dap_chain_node_client_t */ void dap_chain_node_client_reset(dap_chain_node_client_t *a_client) @@ -832,14 +832,14 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) /** - * @brief dap_chain_node_client_send_ch_pkt + * @brief dap_chain_node_client_send_ch_pkt * Send stream request to server - * @param a_client - * @param a_ch_id - * @param a_type - * @param a_pkt_data - * @param a_pkt_data_size - * @return int + * @param a_client + * @param a_ch_id + * @param a_type + * @param a_pkt_data + * @param a_pkt_data_size + * @return int */ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t a_ch_id, uint8_t a_type, const void *a_pkt_data, size_t a_pkt_data_size) @@ -859,9 +859,9 @@ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t * * timeout_ms timeout in milliseconds * waited_state state which we will wait, sample NODE_CLIENT_STATE_CONNECT or NODE_CLIENT_STATE_SENDED - * @param a_client - * @param a_waited_state - * @param a_timeout_ms + * @param a_client + * @param a_waited_state + * @param a_timeout_ms * @return int return -2 false, -1 timeout, 0 end of connection or sending data */ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int a_timeout_ms) @@ -940,10 +940,10 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s /** * @brief dap_chain_node_client_set_callbacks - * + * * @param a_client dap_client_t * @param a_ch_id uint8_t - * @return int + * @return int */ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id) { @@ -1008,8 +1008,8 @@ static void nodelist_response_error_callback(dap_client_t *a_client, int a_err) /** * @brief dap_chain_node_client_send_nodelist_req * Send nodelist request to server - * @param a_client - * @return int + * @param a_client + * @return int */ int dap_chain_node_client_send_nodelist_req(dap_chain_node_client_t *a_client) { diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index edbfd176417eb89446f29934c22fef208cbd0570..a2416a54bdc94de1536463d9717ea4c852b45fb5 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -50,10 +50,10 @@ char *s_server_continents[]={ "North America", "South America", "Southeast Asia", - "Asia", + "Asia", //"Near East", - "Oceania", - "Antarctica" + "Oceania", + "Antarctica" }; struct dap_order_notify { @@ -75,7 +75,7 @@ int dap_chain_net_srv_order_init(void) for (uint16_t i = 0; i < l_net_count; i++) { dap_chain_net_add_notify_callback(l_net_list[i], s_srv_order_callback_notify); } - //geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8"); + //geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8"); return 0; } @@ -173,19 +173,19 @@ bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_o */ const char* dap_chain_net_srv_order_get_country_code(dap_chain_net_srv_order_t *a_order) { - char *l_region = NULL; - if (!dap_chain_net_srv_order_get_continent_region(a_order, NULL, &l_region)) - return NULL; - int l_countries = sizeof(s_server_countries)/sizeof(char*); - for (int i = 0; i < l_countries; i+=4) { - if(l_region && (!strcasecmp(l_region, s_server_countries[i+1]) || !strcasecmp(l_region, s_server_countries[i+2]))){ - const char *l_country_code = s_server_countries[i]; - DAP_DELETE(l_region); - return l_country_code; - } - } - DAP_DELETE(l_region); - return NULL; + char *l_region = NULL; + if (!dap_chain_net_srv_order_get_continent_region(a_order, NULL, &l_region)) + return NULL; + int l_countries = sizeof(s_server_countries)/sizeof(char*); + for (int i = 0; i < l_countries; i+=4) { + if(l_region && (!strcasecmp(l_region, s_server_countries[i+1]) || !strcasecmp(l_region, s_server_countries[i+2]))){ + const char *l_country_code = s_server_countries[i]; + DAP_DELETE(l_region); + return l_country_code; + } + } + DAP_DELETE(l_region); + return NULL; } /** @@ -337,8 +337,9 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord dap_hash_fast(a_order, l_order_size, &l_order_hash); char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_order_hash); char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net); - if (!dap_chain_global_db_gr_set(dap_strdup(l_order_hash_str), DAP_DUP_SIZE(a_order, l_order_size), l_order_size, l_gdb_group_str)) { - DAP_DEL_Z(l_order_hash_str); + if (!dap_chain_global_db_gr_set( l_order_hash_str, a_order, l_order_size, l_gdb_group_str)) { + DAP_DELETE(l_gdb_group_str); + return NULL; } DAP_DELETE(l_gdb_group_str); return l_order_hash_str; @@ -404,14 +405,14 @@ lb_order_pass: if (l_order_pass_first) { if (l_order->version > 2 || l_order->direction > SERV_DIR_SELL || dap_chain_net_srv_order_get_size(l_order) != l_orders[i].value_len) { - dap_chain_global_db_gr_del(dap_strdup(l_orders[i].key), l_gdb_group_str); + dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str); continue; // order is corrupted } dap_chain_hash_fast_t l_hash, l_hash_gdb; dap_hash_fast(l_order, dap_chain_net_srv_order_get_size(l_order), &l_hash); dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb); if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) { - dap_chain_global_db_gr_del(dap_strdup(l_orders[i].key), l_gdb_group_str); + dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str); continue; // order is corrupted } } @@ -478,8 +479,8 @@ int dap_chain_net_srv_order_delete_by_hash_str(dap_chain_net_t * a_net, const ch int ret = -2; if ( a_net && a_hash_str ){ char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net); - char * l_hash_str = strdup( a_hash_str ); - ret = dap_chain_global_db_gr_del( l_hash_str, l_gdb_group_str ) ? 0 : -1; + + ret = dap_chain_global_db_gr_del( a_hash_str, l_gdb_group_str ) ? 0 : -1; DAP_DELETE( l_gdb_group_str ); } return ret; @@ -577,12 +578,12 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const if (a_value && a_op_code != 'a' && dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_value; if (l_order->version != 2) { - dap_chain_global_db_gr_del(dap_strdup(a_key), a_group); + dap_chain_global_db_gr_del( a_key, a_group); } else { dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext_n_sign[l_order->ext_size]; if (!dap_sign_verify_size(l_sign, a_value_len) || dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) { - dap_chain_global_db_gr_del(dap_strdup(a_key), a_group); + dap_chain_global_db_gr_del( a_key, a_group); DAP_DELETE(l_gdb_group_str); return; } diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index 89e60990f917733932661a18b6d60e5163962e81..d51ca88b1de111ef73990cf31e7c03f2bd100530 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -249,7 +249,7 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne log_it(L_ERROR, "Can't create condition for user"); } else { // save transaction for login - dap_chain_global_db_gr_set(dap_strdup("client_tx_cond_hash"), l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), + dap_chain_global_db_gr_set( "client_tx_cond_hash", l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), l_gdb_group); } //DAP_DELETE(l_addr_from_str); @@ -273,15 +273,13 @@ int dap_chain_net_vpn_client_update(dap_chain_net_t *a_net, const char *a_wallet if(!l_wallet) { return -1; } - size_t l_gdb_group_size = 0; + char *l_gdb_group = dap_strdup_printf("local.%s", DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX); - if(!dap_chain_global_db_gr_set(dap_strdup("wallet_name"), (void*) a_wallet_name, dap_strlen(a_wallet_name) + 1, - l_gdb_group)) + if(!dap_chain_global_db_gr_set("wallet_name", a_wallet_name, -1, l_gdb_group)) return -2; - if(!dap_chain_global_db_gr_set(dap_strdup("token_name"), (void*) a_str_token, dap_strlen(a_str_token) + 1, - l_gdb_group)) + if(!dap_chain_global_db_gr_set("token_name", a_str_token, -1, l_gdb_group)) return -2; - if(!dap_chain_global_db_gr_set(dap_strdup("value_datoshi"), &a_value_datoshi, sizeof(a_value_datoshi), l_gdb_group)) + if(!dap_chain_global_db_gr_set("value_datoshi", &a_value_datoshi, sizeof(a_value_datoshi), l_gdb_group)) return -2; DAP_DELETE(l_gdb_group); dap_chain_hash_fast_t *l_hash = dap_chain_net_vpn_client_tx_cond_hash(a_net, l_wallet, a_str_token, diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 7c81dc5d1c6e61e271875b29b8b71bbb2f6b3240..989977fd74a9f7018ece25b5a2842ee843714e73 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -331,14 +331,19 @@ static bool s_xchange_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net) DAP_DELETE(a_tx); dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX); if (!l_chain) { + DAP_DELETE(l_datum); return false; } // Processing will be made according to autoprocess policy - char *l_ret = NULL; - if ((l_ret = dap_chain_mempool_datum_add(l_datum, l_chain)) == NULL) { - DAP_DELETE(l_datum); + char *l_ret = dap_chain_mempool_datum_add(l_datum, l_chain); + + DAP_DELETE(l_datum); + + if ( !l_ret ) return false; - } + + DAP_DELETE(l_ret); + return true; } @@ -361,7 +366,7 @@ static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t *a_price, d if (!l_cond_tx) { log_it(L_WARNING, "Requested conditional transaction not found"); return false; - } + } int l_prev_cond_idx; dap_chain_tx_out_cond_t *l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx); if (dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &a_price->tx_hash, l_prev_cond_idx)) { @@ -432,6 +437,8 @@ dap_chain_net_srv_xchange_price_t *s_xchange_price_from_order(dap_chain_net_t *a static bool s_xchange_db_add(dap_chain_net_srv_xchange_price_t *a_price) { + int rc; + size_t l_size = sizeof(dap_chain_net_srv_xchange_db_item_t) + strlen(a_price->wallet_str) + 1; dap_chain_net_srv_xchange_db_item_t *l_item = DAP_NEW_Z_SIZE(dap_chain_net_srv_xchange_db_item_t, l_size); strcpy(l_item->token_sell, a_price->token_sell); @@ -443,7 +450,11 @@ static bool s_xchange_db_add(dap_chain_net_srv_xchange_price_t *a_price) memcpy(&l_item->tx_hash, &a_price->tx_hash, sizeof(dap_chain_hash_fast_t)); memcpy(&l_item->order_hash, &a_price->order_hash, sizeof(dap_chain_hash_fast_t)); strcpy(l_item->wallet_str, a_price->wallet_str); - return dap_chain_global_db_gr_set(dap_strdup(a_price->key_ptr), (uint8_t *)l_item, l_size, GROUP_LOCAL_XCHANGE); + + rc = dap_chain_global_db_gr_set(a_price->key_ptr, l_item, l_size, GROUP_LOCAL_XCHANGE); + DAP_DELETE(l_item); + + return rc; } static dap_chain_net_srv_xchange_price_t *s_xchange_db_load(char *a_key, uint8_t *a_item) @@ -725,7 +736,7 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c return -14; } HASH_DEL(s_srv_xchange->pricelist, l_price); - dap_chain_global_db_gr_del(dap_strdup(l_price->key_ptr), GROUP_LOCAL_XCHANGE); + dap_chain_global_db_gr_del( l_price->key_ptr, GROUP_LOCAL_XCHANGE); bool l_ret = s_xchage_tx_invalidate(l_price, l_wallet); // may be changed to old price later dap_chain_wallet_close(l_wallet); if (!l_ret) { diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c index 76a2a15f4562531ec96ff25b408ad3ba46133506..89386ed06b23d3d0f5d96c04e6a7566d2e752d40 100644 --- a/modules/type/blocks/dap_chain_block_chunk.c +++ b/modules/type/blocks/dap_chain_block_chunk.c @@ -88,9 +88,6 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl return; dap_chain_block_cache_hash_t * l_chunk_cache_hash = NULL; // Parse block and produce cache object - dap_chain_block_t *l_block = a_block_cache->block; - size_t l_block_size = a_block_cache->block_size; - // Check if already present HASH_FIND(hh, a_chunks->cache, &a_block_cache->block_hash, sizeof (l_chunk_cache_hash->block_hash), l_chunk_cache_hash); if (l_chunk_cache_hash){ @@ -99,7 +96,7 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl return; } // Save to GDB - dap_chain_global_db_gr_set(dap_strdup(a_block_cache->block_hash_str),l_block,l_block_size, a_chunks->gdb_group); + dap_chain_global_db_gr_set(a_block_cache->block_hash_str, a_block_cache->block, a_block_cache->block_size, a_chunks->gdb_group); // And here we select chunk for the new block cache diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 1040e4970beec03fc9a9575ca4576032ffdd4c38..ebc109f0f83d70fda085079255a53d3c5642fccf 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -418,11 +418,11 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) l_datums[0] = l_datum; if ( s_callback_add_datums(l_chain,l_datums,l_datums_count ) == l_datums_count ){ for ( size_t i = 0; i <l_datums_count; i++){ - dap_chain_hash_fast_t l_datum_hash; - dap_hash_fast(l_datums[i],dap_chain_datum_size(l_datums[i]),&l_datum_hash); - char * l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); + dap_chain_hash_fast_t l_datum_hash; + dap_hash_fast(l_datums[i],dap_chain_datum_size(l_datums[i]),&l_datum_hash); + char * l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); - if ( dap_chain_global_db_gr_del( dap_strdup(l_datums_datum_hash_str),l_gdb_group_mempool ) ){ + if ( dap_chain_global_db_gr_del( l_datums_datum_hash_str,l_gdb_group_mempool ) ){ dap_chain_node_cli_set_reply_text(a_str_reply, "Converted datum %s from mempool to event in the new forming round ", l_datums_datum_hash_str); diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index 9abd79deb0828cd90a263366c456482e242d5635..1f07d12882dd1b97bff2c039c8eec4ebdb318462 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -187,7 +187,8 @@ dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event } bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_event_t * a_event, size_t a_event_size, - const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { + const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) +{ dap_chain_cs_dag_event_round_item_t * l_event_round_item = DAP_NEW_SIZE(dap_chain_cs_dag_event_round_item_t, sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_size ); l_event_round_item->event_size = a_event_size; @@ -195,7 +196,7 @@ bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_eve // l_event_round_item->event = DAP_DUP_SIZE(a_event, a_event_size); memcpy(&l_event_round_item->cfg, a_event_round_cfg, sizeof(dap_chain_cs_dag_event_round_cfg_t)); memcpy(l_event_round_item->event, a_event, a_event_size); - bool ret = dap_chain_global_db_gr_set(dap_strdup(a_event_hash_str), (uint8_t *)l_event_round_item, + bool ret = dap_chain_global_db_gr_set(a_event_hash_str, l_event_round_item, dap_chain_cs_dag_event_round_item_get_size(l_event_round_item), a_group); DAP_DELETE(l_event_round_item); @@ -205,7 +206,7 @@ bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_eve dap_chain_cs_dag_event_t* dap_chain_cs_dag_event_gdb_get(const char *a_event_hash_str, size_t *a_event_size, const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { size_t l_event_round_item_size = 0; - dap_chain_cs_dag_event_round_item_t* l_event_round_item = + dap_chain_cs_dag_event_round_item_t* l_event_round_item = (dap_chain_cs_dag_event_round_item_t*)dap_chain_global_db_gr_get(a_event_hash_str, &l_event_round_item_size, a_group ); if ( l_event_round_item == NULL ) return NULL;