diff --git a/dap_chain_global_db.c b/dap_chain_global_db.c index 19e909566833f462c6acbc77be03d13b7b8fedd9..f7a1fe8d831a2a59e6eb7ba820ba93c98695cef0 100755 --- a/dap_chain_global_db.c +++ b/dap_chain_global_db.c @@ -270,7 +270,7 @@ bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group) store_data->group = strdup( a_group); pthread_mutex_lock(&ldb_mutex); int l_res = dap_db_delete(store_data, 1); - if ( l_res >0){ + if (!l_res){ // Extract prefix char * l_group_prefix = extract_group_prefix (a_group); history_group_item_t * l_history_group_item = NULL; @@ -389,7 +389,7 @@ bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count) pthread_mutex_lock(&ldb_mutex); int l_res = dap_db_add(l_store_data, a_objs_count); // Extract prefix if added successfuly, add history log and call notify callback if present - if (l_res>0 ){ + if (!l_res){ for (size_t i =0; i< l_objs_count; i++ ){ history_group_item_t * l_history_group_item = NULL; dap_store_obj_t* l_obj = l_store_data + i; @@ -414,7 +414,8 @@ bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count) } } - if(l_res>0) + pthread_mutex_unlock(&ldb_mutex); + if(!l_res) return true; } else @@ -439,7 +440,7 @@ bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_coun if(l_store_data) { pthread_mutex_lock(&ldb_mutex); int l_res = dap_db_add(l_store_data, a_objs_count); - if (l_res>0 ){ + if (!l_res){ for (size_t i =0; i< a_objs_count; i++ ){ history_group_item_t * l_history_group_item = NULL; dap_store_obj_t *l_obj = l_store_data + i; diff --git a/dap_chain_global_db_hist.c b/dap_chain_global_db_hist.c index c59d49ede8982bb1257f49895dcf659519323e22..aa025efec1346d6e93aa9188e7ab1c8b34e0685d 100755 --- a/dap_chain_global_db_hist.c +++ b/dap_chain_global_db_hist.c @@ -159,7 +159,7 @@ time_t dap_db_log_get_last_timestamp(void) } //printf("l_obj_cur->key=%s\n", l_obj_cur->key); } - time_t l_ret_time = strtoll(last_key, NULL, 10); + time_t l_ret_time = (last_key) ? strtoll(last_key, NULL, 10) : 0; dap_chain_global_db_objs_delete(l_objs); return l_ret_time; } diff --git a/dap_chain_global_db_pvt.c b/dap_chain_global_db_pvt.c index f83cee8e5fbff35dadef9c64580ac12a834137ab..0f29a49fdd050144f26b4066cd7ccc1d039db1f2 100755 --- a/dap_chain_global_db_pvt.c +++ b/dap_chain_global_db_pvt.c @@ -6,6 +6,7 @@ #include "dap_chain_global_db.h" #include "dap_chain_global_db_pvt.h" #include "dap_strfuncs.h" +#include "dap_list.h" #define LOG_TAG "dap_global_db" #define TDB_PREFIX_LEN 7 @@ -149,6 +150,25 @@ int dap_db_del_msg(struct ldb_dn *ldn) } } +static int compare_message_items(const void * l_a, const void * l_b) +{ + const struct ldb_message *l_item_a = (const struct ldb_message*) l_a; + const struct ldb_message *l_item_b = (const struct ldb_message*) l_b; + const struct ldb_val *l_val_a = ldb_msg_find_ldb_val(l_item_a, "time"); + const struct ldb_val *l_val_b = ldb_msg_find_ldb_val(l_item_b, "time"); + time_t timestamp_a = 0; + time_t timestamp_b = 0; + if(l_val_a) + memcpy(×tamp_a, l_val_a->data, min(sizeof(time_t), l_val_a->length)); + if(l_val_b) + memcpy(×tamp_b, l_val_b->data, min(sizeof(time_t), l_val_b->length)); + if(timestamp_a == timestamp_b) + return 0; + if(timestamp_a < timestamp_b) + return -1; + return 1; +} + /** * Get data from base * @@ -197,8 +217,41 @@ pdap_store_obj_t dap_db_read_data(const char *a_query, size_t *a_count) talloc_free(data_message); return NULL; } + + dap_list_t *l_list_items = NULL; + // fill list + for(size_t i = 0; i < data_message->count; i++) { + l_list_items = dap_list_prepend(l_list_items, data_message->msgs[i]); + } + // sort list by time + l_list_items = dap_list_sort(l_list_items, (dap_callback_compare_t) compare_message_items); + + dap_list_t *l_list = l_list_items; + size_t q = 0; + while(l_list) { + const struct ldb_message *l_msgs = l_list->data; + store_data[q].section = strdup(ldb_msg_find_attr_as_string(l_msgs, "section", "")); //strdup("kelvin_nodes"); + store_data[q].group = strdup(ldb_msg_find_attr_as_string(l_msgs, "objectClass", "")); //strdup(group); + store_data[q].type = 1; + store_data[q].key = strdup(ldb_msg_find_attr_as_string(l_msgs, "cn", "")); + // get timestamp + const struct ldb_val *l_val = ldb_msg_find_ldb_val(l_msgs, "time"); + if(l_val) { + memcpy(&store_data[q].timestamp, l_val->data, min(sizeof(time_t), l_val->length)); + } + // get value + l_val = ldb_msg_find_ldb_val(l_msgs, "val"); + if(l_val) { + store_data[q].value_len = l_val->length; + store_data[q].value = DAP_NEW_SIZE(uint8_t, l_val->length); + memcpy(store_data[q].value, l_val->data, l_val->length); + } + q++; + l_list = dap_list_next(l_list); + //log_it(L_INFO, "Record %s read successfully", ldb_dn_get_linearized(data_message->msgs[q]->dn)); + } size_t dap_store_len = data_message->count; - for(size_t q = 0; q < dap_store_len; ++q) { + /*for(size_t q = 0; q < dap_store_len; ++q) { store_data[q].section = strdup(ldb_msg_find_attr_as_string(data_message->msgs[q], "section", "")); //strdup("kelvin_nodes"); store_data[q].group = strdup(ldb_msg_find_attr_as_string(data_message->msgs[q], "objectClass", "")); //strdup(group); store_data[q].type = 1; @@ -216,8 +269,9 @@ pdap_store_obj_t dap_db_read_data(const char *a_query, size_t *a_count) memcpy(store_data[q].value, l_val->data, l_val->length); } //log_it(L_INFO, "Record %s read successfully", ldb_dn_get_linearized(data_message->msgs[q]->dn)); - } + }*/ talloc_free(data_message); + dap_list_free(l_list_items); if(a_count) *a_count = dap_store_len; return store_data; @@ -290,6 +344,7 @@ pdap_store_obj_t dap_db_read_file_data(const char *path, const char *group) * Since we don't know the size, it must be supplied too * * dap_store_size the count records + * return 0 if Ok, <0 if errors */ int dap_db_add(pdap_store_obj_t a_store_obj, size_t a_store_count) { @@ -350,6 +405,7 @@ int dap_db_add(pdap_store_obj_t a_store_obj, size_t a_store_count) * Delete multiple entries from local database. * * dap_store_size the count records + * return 0 if Ok, <0 if errors */ int dap_db_delete(pdap_store_obj_t store_obj, size_t a_store_count) {