diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c index 347acdc7617bc0b0e34bac1375bf57c84905c3ba..88dfe417dd9ec2c6f0c334ae6c26cdf51224833f 100755 --- a/dap_chain_cs_dag.c +++ b/dap_chain_cs_dag.c @@ -61,14 +61,28 @@ typedef struct dap_chain_cs_dag_pvt { #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt ) // Atomic element organization callbacks -static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t *); // Accept new event in dag -static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t *); // Verify new event in dag -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t *); // Get dag event size +static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t ); // Accept new event in dag +static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t ); // Verify new event in dag +static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t ); // Get dag event size static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get dag event header size -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ); // Get the fisrt event from dag -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ); // Get the next event from dag +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ); +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain , + dap_chain_atom_ptr_t a); + + +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter , + dap_chain_hash_fast_t * a_atom_hash); + +// Get event(s) from dag +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ); // Get the next event from dag +static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links( dap_chain_atom_iter_t * a_atom_iter , + size_t * a_links_size_ptr ); // Get list of linked events +static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter , + size_t * a_lasts_size_ptr ); // Get list of linked events + +// Delete iterator static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size); @@ -137,14 +151,23 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) // Atom element callbacks a_chain->callback_atom_add = s_chain_callback_atom_add ; // Accept new element in chain a_chain->callback_atom_verify = s_chain_callback_atom_verify ; // Verify new element in chain - a_chain->callback_atom_hdr_get_size = s_chain_callback_atom_hdr_get_size; // Get dag event size - a_chain->callback_atom_get_hdr_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size + a_chain->callback_atom_get_size = s_chain_callback_atom_hdr_get_size; // Get dag event size + a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create; + a_chain->callback_atom_iter_create_from = s_chain_callback_atom_iter_create_from; a_chain->callback_atom_iter_delete = s_chain_callback_atom_iter_delete; + + // Linear pass through a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain a_chain->callback_atom_iter_get_next = s_chain_callback_atom_iter_get_next; // Get the next element from chain from the current one + a_chain->callback_atom_iter_get_links = s_chain_callback_atom_iter_get_links; // Get the next element from chain from the current one + a_chain->callback_atom_iter_get_lasts = s_chain_callback_atom_iter_get_lasts; + + a_chain->callback_atom_find_by_hash = s_chain_callback_atom_iter_find_by_hash; + + a_chain->callback_datums_pool_proc = s_chain_callback_datums_pool_proc; // Datum operations callbacks @@ -195,7 +218,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) * @param a_atom * @return 0 if verified and added well, otherwise if not */ -static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t * a_atom) +static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) { int ret = s_chain_callback_atom_verify (a_chain, a_atom); if ( ret < 0 ){ @@ -393,7 +416,7 @@ dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * @param a_atom * @return */ -static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t * a_atom) +static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; @@ -501,7 +524,7 @@ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag) * @param a_atom * @return */ -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t * a_atom) +static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t a_atom) { return dap_chain_cs_dag_event_calc_size( (dap_chain_cs_dag_event_t * ) a_atom); } @@ -516,6 +539,29 @@ static size_t s_chain_callback_atom_get_static_hdr_size() return sizeof (dap_chain_class_dag_event_hdr_t); } +/** + * @brief s_chain_callback_atom_iter_create_from + * @param a_chain + * @param a_atom + * @return + */ +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain , + dap_chain_atom_ptr_t a_atom) +{ + dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); + l_atom_iter->chain = a_chain; + l_atom_iter->cur = a_atom; + + dap_chain_hash_fast_t l_atom_hash; + dap_hash_fast(a_atom, a_chain->callback_atom_get_size(a_atom), &l_atom_hash ); + + dap_chain_cs_dag_event_item_t * l_atom_item; + HASH_FIND(hh, PVT(DAP_CHAIN_CS_DAG(a_chain))->events, &l_atom_hash, sizeof(l_atom_hash),l_atom_item ); + l_atom_iter->cur_item = l_atom_item; + return l_atom_iter; + +} + /** * @brief s_chain_callback_atom_iter_create Create atomic element iterator * @param a_chain @@ -533,7 +579,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_ * @param a_atom_iter * @return */ -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter ) +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter ) { a_atom_iter->cur = a_atom_iter->cur ? (dap_chain_cs_dag_event_t*) PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events->event : NULL; @@ -541,28 +587,104 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first(dap_chain_atom return a_atom_iter->cur; } +/** + * @brief s_chain_callback_atom_iter_get_lasts + * @param a_atom_iter + * @param a_lasts_size_ptr + * @return + */ +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter , + size_t * a_lasts_size_ptr ) +{ + dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain ); + + *a_lasts_size_ptr = HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ); + if ( *a_lasts_size_ptr > 0 ) { + dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE( dap_chain_atom_ptr_t, + sizeof (dap_chain_atom_ptr_t*) * (*a_lasts_size_ptr) ); + + dap_chain_cs_dag_event_item_t * l_event_item = NULL, *l_event_item_tmp = NULL; + size_t i = 0; + HASH_ITER(hh,PVT(l_dag)->events_lasts_unlinked, l_event_item,l_event_item_tmp){ + l_ret[i] = l_event_item->event; + i++; + } + return l_ret; + } + return NULL; +} + +/** + * @brief s_chain_callback_atom_iter_get_links + * @param a_atom_iter + * @param a_links_size_ptr + * @return + */ +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_atom_iter_t * a_atom_iter , + size_t * a_links_size_ptr ) +{ + if ( a_atom_iter->cur ){ + dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain ); + dap_chain_cs_dag_event_t * l_event =(dap_chain_cs_dag_event_t *) a_atom_iter->cur; + dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t *) a_atom_iter->cur_item; + if ( l_event->header.hash_count > 0){ + dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_atom_ptr_t, + sizeof (dap_chain_atom_ptr_t*) * l_event->header.hash_count ); + *a_links_size_ptr = l_event->header.hash_count; + for (uint16_t i = 0; i < l_event->header.hash_count; i++){ + dap_chain_cs_dag_event_item_t * l_link_item = NULL; + dap_chain_hash_fast_t * l_link_hash = (dap_chain_hash_fast_t *) + (l_event->hashes_n_datum_n_signs + + i*sizeof(*l_link_hash)); + HASH_FIND(hh, PVT(l_dag)->events,l_link_hash,sizeof(*l_link_hash),l_link_item); + if ( l_link_item ){ + l_ret[i] = l_link_item->event; + }else { + char * l_link_hash_str = dap_chain_hash_fast_to_str_new(l_link_hash); + char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); + log_it(L_ERROR,"Can't find %s->%s links", l_event_hash_str, l_link_hash_str); + DAP_DELETE(l_event_hash_str); + DAP_DELETE(l_link_hash_str); + } + } + return l_ret; + } + } + return NULL; +} + +/** + * @brief s_chain_callback_atom_iter_find_by_hash + * @param a_atom_iter + * @param a_atom_hash + * @return + */ +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter , + dap_chain_hash_fast_t * a_atom_hash) +{ + dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain ); + dap_chain_cs_dag_event_item_t * l_event_item = NULL; + HASH_FIND(hh, PVT(l_dag)->events,a_atom_hash,sizeof(*a_atom_hash),l_event_item); + if ( l_event_item ){ + a_atom_iter->cur_item = l_event_item; + a_atom_iter->cur = l_event_item->event; + return l_event_item->event; + }else + return NULL; +} + /** * @brief s_chain_callback_atom_iter_get_next Get the next dag event * @param a_atom_iter * @return */ -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ) +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ) { if (a_atom_iter->cur ){ dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; a_atom_iter->cur_item = l_event_item->hh.next; l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; - if ( a_atom_iter->cur_item) - a_atom_iter->cur = l_event_item->event; - else { - dap_chain_cs_dag_event_item_t * l_event_search = NULL; - dap_chain_cs_dag_pvt_t * l_dag_pvt = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain)); - HASH_FIND(hh,l_dag_pvt->events,&l_event_item->hash,sizeof(l_event_item->hash),l_event_search); - if (l_event_search){ - a_atom_iter->cur_item = l_dag_pvt->events_treshold; - a_atom_iter->cur = l_dag_pvt->events_treshold ? l_dag_pvt->events_treshold->event : NULL ; - } - } + a_atom_iter->cur = l_event_item->event ; } return a_atom_iter->cur; } @@ -873,25 +995,50 @@ static int s_cli_dag(int argc, const char ** argv, char **a_str_reply) } }break; case SUBCMD_EVENT_LIST:{ - char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; - dap_string_t * l_str_tmp = dap_string_new(NULL); - dap_global_db_obj_t ** l_objs; - size_t l_objs_count = 0; - l_objs = dap_chain_global_db_gr_load(l_gdb_group_events,&l_objs_count); - dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name,l_objs_count); - - for (size_t i = 0; i< l_objs_count; i++){ - dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_objs[i]->value; - char buf[50]; - time_t l_ts_create = (time_t) l_event->header.ts_created; - dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s", - l_objs[i]->key, ctime_r( &l_ts_create,buf ) ); + if( (l_from_events_str == NULL) || + (strcmp(l_from_events_str,"round.new") == 0) ){ + char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; + dap_string_t * l_str_tmp = dap_string_new(NULL); + dap_global_db_obj_t ** l_objs; + size_t l_objs_count = 0; + l_objs = dap_chain_global_db_gr_load(l_gdb_group_events,&l_objs_count); + dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name,l_objs_count); + + for (size_t i = 0; i< l_objs_count; i++){ + dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_objs[i]->value; + char buf[50]; + time_t l_ts_create = (time_t) l_event->header.ts_created; + dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s", + l_objs[i]->key, ctime_r( &l_ts_create,buf ) ); + + } + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); + dap_string_free(l_str_tmp,false); + DAP_DELETE( l_gdb_group_events); + ret = 0; + }else if (l_from_events_str && (strcmp(l_from_events_str,"events") == 0) ){ + dap_string_t * l_str_tmp = dap_string_new(NULL); + size_t l_events_count = HASH_COUNT(PVT(l_dag)->events); + dap_string_append_printf(l_str_tmp,"%s.%s: Have %u events :\n", + l_net->pub.name,l_chain->name,l_events_count); + dap_chain_cs_dag_event_item_t * l_event_item = NULL,*l_event_item_tmp = NULL; + HASH_ITER(hh,PVT(l_dag)->events,l_event_item, l_event_item_tmp ) { + char buf[50]; + char * l_event_item_hash_str = dap_chain_hash_fast_to_str_new( &l_event_item->hash); + time_t l_ts_create = (time_t) l_event_item->event->header.ts_created; + dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s", + l_event_item_hash_str, ctime_r( &l_ts_create,buf ) ); + DAP_DELETE(l_event_item_hash_str); + } + + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); + dap_string_free(l_str_tmp,false); + + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Undefined events source for listing "); + ret=-14; } - dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); - dap_string_free(l_str_tmp,false); - DAP_DELETE( l_gdb_group_events); - ret = 0; }break; case SUBCMD_UNDEFINED: {