From 864a1a5dc3069a01474c8674d1f96443a3e52939 Mon Sep 17 00:00:00 2001 From: Aleksandr Lysikov <lysikov@inbox.ru> Date: Mon, 20 May 2019 22:22:28 +0500 Subject: [PATCH] 1 --- dap_chain_gdb.c | 101 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 27 deletions(-) diff --git a/dap_chain_gdb.c b/dap_chain_gdb.c index 0d240f3..4a5e112 100644 --- a/dap_chain_gdb.c +++ b/dap_chain_gdb.c @@ -45,12 +45,17 @@ typedef struct dap_chain_gdb_private char *group_tx; char *group_ledger; + dap_chain_t *chain; + dap_ledger_t *ledger; + pthread_rwlock_t events_rwlock; } dap_chain_gdb_private_t; #define GDB_INTERNAL(a) ( (dap_chain_gdb_private_t* ) (a) ? a->_internal : NULL ) #define DAP_CHAIN_GDB(a) ( (dap_chain_gdb_t *) (a)->_inheritor) +static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net); + // 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 gdb static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t); // Verify new event in gdb @@ -87,6 +92,19 @@ static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) return 0; } +/** + * Get cell group by dap_chain_t + */ +static char* get_cell_group(dap_chain_t * a_chain) +{ + char *l_group = NULL; + if(!a_chain) + return NULL; + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + if(l_net) + l_group = dap_strdup_printf("cell.0x%016X.", l_net->pub.cell_id.uint64); + return l_group; +} /** * @brief dap_chain_cs_gdb_init * @return @@ -100,6 +118,11 @@ int dap_chain_gdb_init(void) return 0; } +static void db_obj_callback_notify(const char a_op_code, const char * a_prefix, const char * a_group, + const char * a_key, const void * a_value, const size_t a_value_len) +{ + return; +} /** * @brief dap_chain_gdb_new * @param a_chain @@ -114,13 +137,30 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) a_chain->_inheritor = l_gdb; pthread_rwlock_init(&l_gdb_priv->events_rwlock, NULL); - l_gdb_priv->group_tx = dap_strdup(dap_config_get_item_str(a_chain_cfg, CONSENSUS_NAME, "group_tx")); - l_gdb_priv->group_ledger = dap_strdup(dap_config_get_item_str(a_chain_cfg, CONSENSUS_NAME, "group_ledger")); + l_gdb_priv->celled = dap_config_get_item_bool(a_chain_cfg, CONSENSUS_NAME, "celled"); + //l_gdb_priv->group_tx = dap_strdup(dap_config_get_item_str(a_chain_cfg, CONSENSUS_NAME, "group_tx")); + //l_gdb_priv->group_ledger = dap_strdup(dap_config_get_item_str(a_chain_cfg, CONSENSUS_NAME, "group_ledger")); + + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + l_gdb_priv->ledger = (l_net) ? l_net->pub.ledger : NULL; + l_gdb_priv->chain = a_chain; + + if(!l_gdb_priv->celled) + l_gdb_priv->group_tx = dap_strdup("global."); + else { + // here is not work because dap_chain_net_load() not yet fully performed + l_gdb_priv->group_tx = get_cell_group(a_chain); + } + // Add group prefix that will be tracking all changes + dap_chain_global_db_add_history_group_prefix(l_gdb_priv->group_tx); + dap_chain_global_db_add_history_group_prefix("global"); + + dap_chain_global_db_add_history_callback_notify(l_gdb_priv->group_tx, db_obj_callback_notify); + dap_chain_global_db_add_history_callback_notify("global", db_obj_callback_notify); + // load ledger + int l_res = dap_chain_gdb_ledger_load(l_gdb, l_net); a_chain->callback_delete = dap_chain_gdb_delete; - //dap_chain_cs_dag_t * l_dag = DAP_NEW_Z(dap_chain_cs_dag_t); - //l_dag->_pvt = DAP_NEW_Z(dap_chain_cs_dag_pvt_t); - //l_dag->chain = a_chain; // Atom element callbacks a_chain->callback_atom_add = s_chain_callback_atom_add; // Accept new element in chain @@ -165,8 +205,8 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain) static int compare_datum_items(const void * l_a, const void * l_b) { - dap_chain_datum_t *l_item_a = (dap_chain_datum_t*) l_a; - dap_chain_datum_t *l_item_b = (dap_chain_datum_t*) l_b; + const dap_chain_datum_t *l_item_a = (const dap_chain_datum_t*) l_a; + const dap_chain_datum_t *l_item_b = (const dap_chain_datum_t*) l_b; if(l_item_a->header.ts_create == l_item_b->header.ts_create) return 0; if(l_item_a->header.ts_create < l_item_b->header.ts_create) @@ -179,19 +219,19 @@ static int compare_datum_items(const void * l_a, const void * l_b) * * return 0 if OK otherwise negative error code */ -int dap_chain_gdb_ledger_load(dap_chain_gdb_t *l_gdb, dap_ledger_t *a_ledger, const char *a_net_name, const char *a_chain_name) +static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net) { + dap_chain_gdb_private_t *l_gdb_priv = GDB_INTERNAL(a_gdb); + dap_list_t *l_datum_list = NULL, *l_list_tmp = NULL; // protect from reloading - if(dap_chain_ledger_count(a_ledger) > 0) + if(dap_chain_ledger_count(l_gdb_priv->ledger) > 0) return 0; - dap_chain_gdb_private_t *l_gdb_priv = GDB_INTERNAL(l_gdb); - dap_list_t *l_datum_list = NULL, *l_list_tmp = NULL; // Read first transaction mempool group name - dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); - dap_chain_t * l_chain_base_tx = (l_net) ? dap_chain_net_get_chain_by_name(l_net, a_chain_name) : NULL; + //dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); + //dap_chain_t * l_chain_base_tx = (a_net) ? dap_chain_net_get_chain_by_name(a_net, a_chain_name) : NULL; char * l_gdb_group_mempool_base_tx = - (l_chain_base_tx) ? dap_chain_net_get_gdb_group_mempool(l_chain_base_tx) : NULL; + (l_gdb_priv->chain) ? dap_chain_net_get_gdb_group_mempool(l_gdb_priv->chain) : NULL; // Read first transaction in mempool_groups from a_mempool_group_names_list size_t l_data_size = 0; @@ -219,7 +259,7 @@ int dap_chain_gdb_ledger_load(dap_chain_gdb_t *l_gdb, dap_ledger_t *a_ledger, co if(l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; if(dap_chain_datum_tx_get_size(l_tx) == l_datum->header.data_size) - dap_chain_ledger_tx_add(a_ledger,l_tx); + dap_chain_ledger_tx_add(l_gdb_priv->ledger, l_tx); } l_list_tmp = dap_list_next(l_list_tmp); } @@ -228,6 +268,24 @@ int dap_chain_gdb_ledger_load(dap_chain_gdb_t *l_gdb, dap_ledger_t *a_ledger, co return 0; } +/** + * @brief s_chain_callback_datums_add + * @param a_chain + * @param a_datums + * @param a_datums_size + */ +static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, + size_t a_datums_count) +{ + dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); + dap_chain_gdb_private_t *l_gdb_priv = GDB_INTERNAL(l_gdb); + for(size_t i = 0; i < a_datums_count; i++) { + dap_chain_datum_t *l_datum_tx = a_datums[i]; + if(l_datum_tx->header.type_id == DAP_CHAIN_DATUM_TX) + dap_chain_ledger_tx_add(l_gdb_priv->ledger, (dap_chain_datum_tx_t*) l_datum_tx->data); + } + return 0; +} /** * @brief s_chain_callback_datums_add @@ -237,6 +295,7 @@ int dap_chain_gdb_ledger_load(dap_chain_gdb_t *l_gdb, dap_ledger_t *a_ledger, co */ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) { + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) a_atom; return 0; } @@ -314,18 +373,6 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at return 0; } -/** - * @brief s_chain_callback_datums_add - * @param a_chain - * @param a_datums - * @param a_datums_size - */ -static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, - size_t a_datums_count) -{ - return 0; -} - /** * @brief s_chain_callback_atom_iter_get_first Get the first dag event * @param a_atom_iter -- GitLab