diff --git a/global-db/dap_global_db.c b/global-db/dap_global_db.c index 5295025dbad3f9ff068898a14c190c04ecbac666..d118513010bdf41e41b6add1db3876059f7bcd92 100644 --- a/global-db/dap_global_db.c +++ b/global-db/dap_global_db.c @@ -1357,7 +1357,7 @@ int dap_global_db_unpin(const char *a_group, const char *a_key, dap_global_db_ca * @param a_key * @return */ -static int s_del_sync_with_dbi(dap_global_db_instance_t *a_dbi, const char *a_group, const char *a_key) +static int s_del_sync_with_dbi_ex(dap_global_db_instance_t *a_dbi, const char *a_group, const char *a_key, const char * a_value, size_t a_value_len) { dap_store_obj_t l_store_obj = { .key = (char*)a_key, @@ -1365,6 +1365,12 @@ static int s_del_sync_with_dbi(dap_global_db_instance_t *a_dbi, const char *a_gr .flags = DAP_GLOBAL_DB_RECORD_NEW | (a_key ? DAP_GLOBAL_DB_RECORD_DEL : DAP_GLOBAL_DB_RECORD_ERASE), .timestamp = dap_nanotime_now() }; + + if (a_value) { + l_store_obj.value = (byte_t*)a_value; + l_store_obj.value_len = a_value_len; + } + if (a_key) l_store_obj.sign = dap_store_obj_sign(&l_store_obj, a_dbi->signing_key, &l_store_obj.crc); @@ -1382,12 +1388,23 @@ static int s_del_sync_with_dbi(dap_global_db_instance_t *a_dbi, const char *a_gr return l_res; } +static int s_del_sync_with_dbi(dap_global_db_instance_t *a_dbi, const char *a_group, const char *a_key) { + return s_del_sync_with_dbi_ex(a_dbi, a_group, a_key, NULL, 0); +} + inline int dap_global_db_del_sync(const char *a_group, const char *a_key) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); return s_del_sync_with_dbi(s_dbi, a_group, a_key); } +inline int dap_global_db_del_sync_ex(const char *a_group, const char *a_key, const char * a_value, size_t a_value_len) +{ + dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); + return s_del_sync_with_dbi_ex(s_dbi, a_group, a_key, a_value, a_value_len); +} + + /** * @brief dap_global_db_delete * @param a_group @@ -1396,7 +1413,8 @@ inline int dap_global_db_del_sync(const char *a_group, const char *a_key) * @param a_arg * @return */ -int dap_global_db_del(const char * a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg) +int dap_global_db_del_ex(const char * a_group, const char *a_key, const void * a_value, + const size_t a_value_len, dap_global_db_callback_result_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); @@ -1406,6 +1424,10 @@ int dap_global_db_del(const char * a_group, const char *a_key, dap_global_db_cal l_msg->key = dap_strdup(a_key); l_msg->callback_arg = a_arg; l_msg->callback_result = a_callback; + if (a_value_len) { + l_msg->value = DAP_DUP_SIZE(a_value, a_value_len); + l_msg->value_length = a_value_len; + } int l_ret = dap_proc_thread_callback_add(NULL, s_queue_io_callback, l_msg); if (l_ret != 0) { @@ -1417,6 +1439,10 @@ int dap_global_db_del(const char * a_group, const char *a_key, dap_global_db_cal return l_ret; } +int dap_global_db_del(const char * a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg) { + return dap_global_db_del_ex(a_group, a_key, NULL, 0, a_callback, a_arg); +} + /** * @brief erase table, call dap_global_db_del_sync with NULL key * @param a_group - table name @@ -1446,7 +1472,12 @@ DAP_INLINE int dap_global_db_erase_table(const char *a_group, dap_global_db_call */ static void s_msg_opcode_delete(struct queue_io_msg * a_msg) { - int l_res = dap_global_db_del_sync(a_msg->group, a_msg->key); + int l_res = 0; + if (a_msg->value && a_msg->value_length) { + l_res = dap_global_db_del_sync_ex(a_msg->group, a_msg->key, a_msg->value, a_msg->value_length); + } else { + l_res = dap_global_db_del_sync(a_msg->group, a_msg->key); + } if(a_msg->callback_result) { a_msg->callback_result(a_msg->dbi, l_res==0 ? DAP_GLOBAL_DB_RC_SUCCESS: diff --git a/global-db/include/dap_global_db.h b/global-db/include/dap_global_db.h index 6b553ba0efde9553f0b300fa3674e16f50bddfb1..be681d8e67678ccfb9f8fcee057e875a8c8628a5 100644 --- a/global-db/include/dap_global_db.h +++ b/global-db/include/dap_global_db.h @@ -142,6 +142,8 @@ int dap_global_db_set_raw(dap_store_obj_t *a_store_objs, size_t a_store_objs_cou int dap_global_db_pin(const char *a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg); int dap_global_db_unpin(const char *a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg); int dap_global_db_del(const char *a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg); +int dap_global_db_del_ex(const char * a_group, const char *a_key, const void * a_value, const size_t a_value_len, + dap_global_db_callback_result_t a_callback, void *a_arg); int dap_global_db_flush( dap_global_db_callback_result_t a_callback, void *a_arg); // Set multiple. In callback writes total processed objects to a_values_total and a_values_count to the a_values_count as well @@ -164,6 +166,7 @@ int dap_global_db_set_raw_sync(dap_store_obj_t *a_store_objs, size_t a_store_obj int dap_global_db_pin_sync(const char *a_group, const char *a_key); int dap_global_db_unpin_sync(const char *a_group, const char *a_key); int dap_global_db_del_sync(const char *a_group, const char *a_key); +int dap_global_db_del_sync_ex(const char *a_group, const char *a_key, const char * a_value, size_t a_value_size); int dap_global_db_flush_sync(); bool dap_global_db_isalnum_group_key(const dap_store_obj_t *a_obj, bool a_not_null_key);