diff --git a/dap_chain_gdb.c b/dap_chain_gdb.c index b30f214baabacf9284153b977353619e2d58ba5d..17d9aabcdbf54250ea88111ea53d890d989daafd 100644 --- a/dap_chain_gdb.c +++ b/dap_chain_gdb.c @@ -63,7 +63,7 @@ typedef struct dap_chain_gdb_private dap_chain_gdb_datum_hash_item_t * hash_items; } dap_chain_gdb_private_t; -#define PVT(a) ( (dap_chain_gdb_private_t* ) (a)->_internal ) +#define PVT(a) ( (a) ? (dap_chain_gdb_private_t* ) (a)->_internal : NULL) static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net); @@ -93,6 +93,9 @@ static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts(dap_chain_atom 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); +static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, + size_t a_datums_size, const char *a_group); + /** * Stub for consensus @@ -190,6 +193,7 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) 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; + a_chain->callback_datums_pool_proc_with_group = s_chain_callback_datums_pool_proc_with_group; // Linear pass through a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain @@ -217,6 +221,21 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain) a_chain->_inheritor = NULL; } +/** + * @brief dap_chain_gdb_get_group + * @param a_chain + * @return group name for ledger + */ +const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) +{ + if(!a_chain) + return NULL; + dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); + dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb); + return l_gdb_priv->group_datums; +} + + /** * @brief compare_datum_items * @param l_a @@ -286,6 +305,14 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain return a_datums_count; } +static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, + size_t a_datums_count, const char *a_group) +{ + if(dap_strcmp(dap_chain_gdb_get_group(a_chain), a_group)) + return 0; + s_chain_callback_datums_pool_proc(a_chain, a_datums, a_datums_count); +} + /** * @brief s_chain_callback_datums_add * @param a_chain diff --git a/dap_chain_gdb.h b/dap_chain_gdb.h index fdab44a1d5b0b31896f10ec6614e71ab29bfbf78..e40ae2184e63b48f74f699755053ed77c5420eb5 100644 --- a/dap_chain_gdb.h +++ b/dap_chain_gdb.h @@ -33,9 +33,10 @@ typedef struct dap_chain_gdb { void * _inheritor; // inheritor object } dap_chain_gdb_t; -#define DAP_CHAIN_GDB(a) ( (dap_chain_gdb_t *) (a)->_inheritor) +#define DAP_CHAIN_GDB(a) ( (a) ? (dap_chain_gdb_t *) (a)->_inheritor : NULL) int dap_chain_gdb_init(void); int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); void dap_chain_gdb_delete(dap_chain_t * a_chain); +const char* dap_chain_gdb_get_group(dap_chain_t * a_chain);