diff --git a/dap_chain_global_db.c b/dap_chain_global_db.c index f28b49dc147ae6b8d821a5ef5c52e5248cf002d0..4b54fcf99a6259276a316dd162064fb7db24fe72 100755 --- a/dap_chain_global_db.c +++ b/dap_chain_global_db.c @@ -331,8 +331,8 @@ bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group) if(!a_key) return NULL; pdap_store_obj_t store_data = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(struct dap_store_obj)); - store_data->key = dap_strdup(a_key); - store_data->group = dap_strdup(a_group); + store_data->key = a_key; + store_data->group = a_group; lock(); int l_res = dap_chain_global_db_driver_delete(store_data, 1); unlock(); diff --git a/dap_chain_global_db_driver_sqlite.c b/dap_chain_global_db_driver_sqlite.c index 626506289758ac959151d7686477679c8abdb25f..990bda5c7a0917411b7dc7b7267f320d34ac9f2b 100755 --- a/dap_chain_global_db_driver_sqlite.c +++ b/dap_chain_global_db_driver_sqlite.c @@ -439,6 +439,22 @@ int dap_db_driver_sqlite_end_transaction(void) return -1; } +char *dap_db_driver_sqlite_make_table_name(const char *a_group_name) +{ + char *l_group_name = dap_strdup(a_group_name); + ssize_t l_group_name_len = dap_strlen(l_group_name); + const char *l_needle = "."; + // replace '.' to '_' + while(1){ + char *l_str = dap_strstr_len(l_group_name, l_group_name_len, l_needle); + if(l_str) + *l_str = '_'; + else + break; + } + return l_group_name; +} + /** * Apply data (write or delete) * @@ -455,11 +471,13 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) //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 + char *table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group); 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); + table_name, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value); + DAP_DELETE(table_name); //dap_db_driver_sqlite_free(l_blob_hash); dap_db_driver_sqlite_free(l_blob_value); } @@ -482,7 +500,9 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) 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); + char *table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group); + dap_db_driver_sqlite_create_group_table(table_name); + DAP_DELETE(table_name); // repeat request l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message); @@ -491,9 +511,11 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) if(l_ret == SQLITE_CONSTRAINT) { dap_db_driver_sqlite_free(l_error_message); l_error_message = NULL; + char *table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group); //delete exist record - char *l_query_del = sqlite3_mprintf("delete from '%s' where key = '%s'", a_store_obj->group, a_store_obj->key); + char *l_query_del = sqlite3_mprintf("delete from '%s' where key = '%s'", table_name, a_store_obj->key); l_ret = dap_db_driver_sqlite_exec(s_db, l_query_del, &l_error_message); + DAP_DELETE(table_name); 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); diff --git a/dap_chain_global_db_hist.c b/dap_chain_global_db_hist.c index b1ca5b4a9dfa643d265bd1ad30a71c065bf08fca..3ac5ff0cf8e39d1c1c717e1127bd5b7ebfcc669d 100755 --- a/dap_chain_global_db_hist.c +++ b/dap_chain_global_db_hist.c @@ -1103,6 +1103,7 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_ int l_res = dap_chain_global_db_driver_add(&l_store_data, 1); if(l_rec.keys_count > 1) DAP_DELETE(l_rec.keys); + DAP_DELETE(l_store_data.value); DAP_DELETE(l_str); if(!l_res) return true;