diff --git a/dap_chain_global_db.h b/dap_chain_global_db.h index 17a9aae76976d9e63ec4e63ad74dc89e060fa155..381b3ac9687fc144c12e8f8c3835436982dfd8d8 100755 --- a/dap_chain_global_db.h +++ b/dap_chain_global_db.h @@ -15,6 +15,7 @@ #define GROUP_LOCAL_GENERAL "local.general" typedef struct dap_global_db_obj { + uint64_t id; char *key; uint8_t *value; size_t value_len; @@ -104,10 +105,10 @@ void* dap_db_log_unpack(const void *a_data, size_t a_data_size, size_t *a_store_ // Get timestamp from dap_db_log_pack() //time_t dap_db_log_unpack_get_timestamp(uint8_t *a_data, size_t a_data_size); -// Get last timestamp in log -time_t dap_db_log_get_last_timestamp(void); +// Get last id in log +uint64_t dap_db_log_get_last_id(void); // Get log diff as list -dap_list_t* dap_db_log_get_list(time_t first_timestamp); +dap_list_t* dap_db_log_get_list(uint64_t first_id); // Free list getting from dap_db_log_get_list() void dap_db_log_del_list(dap_list_t *a_list); // Get log diff as string diff --git a/dap_chain_global_db_driver.c b/dap_chain_global_db_driver.c index 0ffefe6a1104d27aa5a74846f04d8397a6673516..745887fb89122b3bd34029b4f2ce7cb6a5aaa3bc 100755 --- a/dap_chain_global_db_driver.c +++ b/dap_chain_global_db_driver.c @@ -176,7 +176,7 @@ void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count) static size_t dap_db_get_size_pdap_store_obj_t(pdap_store_obj_t store_obj) { size_t size = sizeof(uint32_t) + 2 * sizeof(uint16_t) + sizeof(size_t) + sizeof(time_t) - + dap_strlen(store_obj->group) + + + sizeof(uint64_t) + dap_strlen(store_obj->group) + dap_strlen(store_obj->key) + store_obj->value_len; return size; } @@ -220,6 +220,8 @@ dap_store_obj_pkt_t *dap_store_packet_multiple(pdap_store_obj_t a_store_obj, tim l_offset += sizeof(uint16_t); memcpy(l_pkt->data + l_offset, obj.group, group_size); l_offset += group_size; + memcpy(l_pkt->data + l_offset, &obj.id, sizeof(uint64_t)); + l_offset += sizeof(uint64_t); memcpy(l_pkt->data + l_offset, &obj.timestamp, sizeof(time_t)); l_offset += sizeof(time_t); memcpy(l_pkt->data + l_offset, &key_size, sizeof(uint16_t)); @@ -267,6 +269,9 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz memcpy(obj->group, pkt->data + offset, str_size); offset += str_size; + memcpy(&obj->id, pkt->data + offset, sizeof(uint64_t)); + offset += sizeof(uint64_t); + memcpy(&obj->timestamp, pkt->data + offset, sizeof(time_t)); offset += sizeof(time_t); diff --git a/dap_chain_global_db_driver_sqlite.c b/dap_chain_global_db_driver_sqlite.c index d9f7251a4d3b3d74a315577dc2d9014832abface..626506289758ac959151d7686477679c8abdb25f 100755 --- a/dap_chain_global_db_driver_sqlite.c +++ b/dap_chain_global_db_driver_sqlite.c @@ -451,16 +451,16 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) char *l_error_message = NULL; if(a_store_obj->type == 'a') { if(!a_store_obj->key || !a_store_obj->value || !a_store_obj->value_len) - return -1; - dap_chain_hash_fast_t l_hash; - dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash); + return -1; + //dap_chain_hash_fast_t l_hash; + //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash); - char *l_blob_hash = dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t)); + char *l_blob_hash = ""; //dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t)); char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, a_store_obj->value_len); //add one record l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')", a_store_obj->group, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value); - dap_db_driver_sqlite_free(l_blob_hash); + //dap_db_driver_sqlite_free(l_blob_hash); dap_db_driver_sqlite_free(l_blob_value); } else if(a_store_obj->type == 'd') { @@ -476,27 +476,41 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) log_it(L_ERROR, "Unknown store_obj type '0x%x'", a_store_obj->type); return -1; } - int l_ret = dap_db_driver_sqlite_exec(s_db, l_query, NULL); - // missing database + // execute request + int l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message); if(l_ret == SQLITE_ERROR) { + dap_db_driver_sqlite_free(l_error_message); + l_error_message = NULL; // create table dap_db_driver_sqlite_create_group_table(a_store_obj->group); + // repeat request l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message); + } - dap_db_driver_sqlite_free(l_query); // entry with the same hash is already present if(l_ret == SQLITE_CONSTRAINT) { - log_it(L_INFO, "Entry with the same key is already present, %s", l_error_message); dap_db_driver_sqlite_free(l_error_message); - return 0; + l_error_message = NULL; + //delete exist record + char *l_query_del = sqlite3_mprintf("delete from '%s' where key = '%s'", a_store_obj->group, a_store_obj->key); + l_ret = dap_db_driver_sqlite_exec(s_db, l_query_del, &l_error_message); + dap_db_driver_sqlite_free(l_query_del); + if(l_ret != SQLITE_OK) { + log_it(L_INFO, "Entry with the same key is already present and can't delete, %s", l_error_message); + dap_db_driver_sqlite_free(l_error_message); + l_error_message = NULL; + } + // repeat request + l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message); } - if(l_ret != SQLITE_OK) - { + // missing database + if(l_ret != SQLITE_OK) { log_it(L_ERROR, "sqlite apply error: %s", l_error_message); dap_db_driver_sqlite_free(l_error_message); - return -1; + l_ret = -1; } - return 0; + dap_db_driver_sqlite_free(l_query); + return l_ret; } static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_ROW_VALUE *a_row) diff --git a/dap_chain_global_db_hist.c b/dap_chain_global_db_hist.c index b3704aa2c6f29b8ddeb944bf9e0afa5d79823b27..8d63d2c949dc5f3ec942aa31400cbf09bf2f2508 100755 --- a/dap_chain_global_db_hist.c +++ b/dap_chain_global_db_hist.c @@ -73,11 +73,14 @@ uint8_t* dap_db_log_pack(dap_global_db_obj_t *a_obj, size_t *a_data_size_out) while(l_keys[i]) { dap_store_obj_t *l_obj = NULL; // add record - read record - if(l_rec.type == 'a') + if(l_rec.type == 'a'){ l_obj = (dap_store_obj_t*) dap_chain_global_db_obj_get(l_keys[i], l_rec.group); + l_obj->id = a_obj->id; + } // delete record - save only key for record else if(l_rec.type == 'd') { // //section=strdup("kelvin_nodes"); l_obj = (dap_store_obj_t*) DAP_NEW_Z(dap_store_obj_t); + l_obj->id = a_obj->id; l_obj->group = dap_strdup(l_rec.group); l_obj->key = dap_strdup(l_keys[i]); } @@ -167,7 +170,7 @@ bool dap_db_history_truncate(void) /** * Get last timestamp in log */ -time_t dap_db_log_get_last_timestamp(void) +uint64_t dap_db_log_get_last_id(void) { //dap_store_obj_t *l_last_obj = dap_chain_global_db_driver_read_last( dap_store_obj_t *l_last_obj = dap_chain_global_db_get_last(GROUP_LOCAL_HISTORY); @@ -192,26 +195,27 @@ time_t dap_db_log_get_last_timestamp(void) return l_ret_time;*/ } -static int compare_items(const void * l_a, const void * l_b) +/*static int compare_items(const void * l_a, const void * l_b) { const dap_global_db_obj_t *l_item_a = (const dap_global_db_obj_t*) l_a; const dap_global_db_obj_t *l_item_b = (const dap_global_db_obj_t*) l_b; int l_ret = strcmp(l_item_a->key, l_item_b->key); return l_ret; -} +}*/ /** * Get log diff as list */ -dap_list_t* dap_db_log_get_list(time_t first_timestamp) +dap_list_t* dap_db_log_get_list(uint64_t first_id) { dap_list_t *l_list = NULL; size_t l_data_size_out = 0; - dap_store_obj_t *l_objs = dap_chain_global_db_cond_load(GROUP_LOCAL_HISTORY, first_timestamp, &l_data_size_out); + dap_store_obj_t *l_objs = dap_chain_global_db_cond_load(GROUP_LOCAL_HISTORY, first_id, &l_data_size_out); //dap_global_db_obj_t **l_objs = dap_chain_global_db_gr_load(GROUP_LOCAL_HISTORY, first_timestamp, &l_data_size_out); for(size_t i = 0; i < l_data_size_out; i++) { dap_store_obj_t *l_obj_cur = l_objs + i; dap_global_db_obj_t *l_item = DAP_NEW(dap_global_db_obj_t); + l_item->id = l_obj_cur->id; l_item->key = dap_strdup(l_obj_cur->key); l_item->value = (uint8_t*) dap_strdup((char*) l_obj_cur->value); l_list = dap_list_append(l_list, l_item);