diff --git a/dap_chain_global_db.c b/dap_chain_global_db.c index b7b0f4a1ed20f5db632f58ee95056a1b22fc7696..ad60400c7d912d2b73b45272b552d1f944be8770 100644 --- a/dap_chain_global_db.c +++ b/dap_chain_global_db.c @@ -2,12 +2,18 @@ #include <string.h> #include <stdio.h> +#include <pthread.h> + +// for access from several streams +static pthread_mutex_t ldb_mutex = PTHREAD_MUTEX_INITIALIZER; int dap_chain_global_db_init(const char *a_storage_path) { if(a_storage_path) { + pthread_mutex_lock(&ldb_mutex); int res = dap_db_init(a_storage_path); + pthread_mutex_unlock(&ldb_mutex); return res; } return -1; @@ -15,7 +21,9 @@ int dap_chain_global_db_init(const char *a_storage_path) void dap_chain_global_db_deinit(void) { + pthread_mutex_lock(&ldb_mutex); dap_db_deinit(); + pthread_mutex_unlock(&ldb_mutex); } /** @@ -29,7 +37,9 @@ char * dap_chain_global_db_get(const char *a_key) return NULL; char query[32 + strlen(a_key)]; sprintf(query, "(cn=%s)(objectClass=addr_leased)", a_key); + pthread_mutex_lock(&ldb_mutex); pdap_store_obj_t store_data = dap_db_read_data(query, &count); + pthread_mutex_unlock(&ldb_mutex); if(count == 1 && store_data && !strcmp(store_data->key, a_key)) str = (store_data->value) ? strdup(store_data->value) : NULL; dab_db_free_pdap_store_obj_t(store_data, count); @@ -44,13 +54,33 @@ bool dap_chain_global_db_set(const char *a_key, const char *a_value) pdap_store_obj_t store_data = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(struct dap_store_obj)); store_data->key = (char*) a_key; store_data->value = (char*) a_value; + pthread_mutex_lock(&ldb_mutex); int res = dap_db_merge(store_data, 1); + pthread_mutex_unlock(&ldb_mutex); DAP_DELETE(store_data); if(!res) return true; return false; } +/** + * Delete entry from base + */ +bool dap_chain_global_db_del(const char *a_key) +{ + char *str = NULL; + 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 = (char*) a_key; + pthread_mutex_lock(&ldb_mutex); + int res = dap_db_delete(store_data, 1); + pthread_mutex_unlock(&ldb_mutex); + DAP_DELETE(store_data); + if(!res) + return true; + return false; +} /** * Read the entire database into an array of size bytes * @@ -62,7 +92,9 @@ uint8_t* dap_chain_global_db_load(size_t *data_size) const char *query = "(objectClass=addr_leased)"; int count = 0; // Read data + pthread_mutex_lock(&ldb_mutex); pdap_store_obj_t store_obj = dap_db_read_data(query, &count); + pthread_mutex_unlock(&ldb_mutex); // Serialization data dap_store_obj_pkt_t *pkt = dap_store_packet_multiple(store_obj, count); dab_db_free_pdap_store_obj_t(store_obj, count); @@ -96,7 +128,9 @@ bool dap_chain_global_db_save(uint8_t* data, size_t data_size) DAP_DELETE(pkt); if(store_data) { + pthread_mutex_lock(&ldb_mutex); int res = dap_db_merge(store_data, count); + pthread_mutex_unlock(&ldb_mutex); dab_db_free_pdap_store_obj_t(store_data, count); if(!res) return true; diff --git a/dap_chain_global_db.h b/dap_chain_global_db.h index a281cdcc8e19a04f92d9817af036881f5f0fdb96..40476504b0185b2edd7f86c6f91d6775dd7e3d9e 100644 --- a/dap_chain_global_db.h +++ b/dap_chain_global_db.h @@ -17,6 +17,11 @@ char* dap_chain_global_db_get(const char *a_key); */ bool dap_chain_global_db_set(const char *a_key, const char *a_value); +/** + * Delete entry from base + */ +bool dap_chain_global_db_del(const char *a_key); + /** * Read the entire database into an array of size bytes * diff --git a/dap_chain_global_db_pvt.c b/dap_chain_global_db_pvt.c index aff52342dd1a27d42e0c6131edb0e32f7faa7a96..3c37412c50c01edafb5001bda0824ed7cbf73f9f 100644 --- a/dap_chain_global_db_pvt.c +++ b/dap_chain_global_db_pvt.c @@ -7,6 +7,9 @@ #define LOG_TAG "dap_global_db" #define TDB_PREFIX_LEN 7 +static struct ldb_context *ldb = NULL; +static TALLOC_CTX *mem_ctx = NULL; + //static int dap_store_len = 0; // initialized only when reading from local db static char *dap_db_path = NULL; @@ -66,6 +69,7 @@ int dap_db_init(const char *path) log_it(L_ERROR, "Couldn't initialize LDB context"); return -2; } + return -1; } int dap_db_add_msg(struct ldb_message *msg) @@ -96,6 +100,24 @@ int dap_db_add_msg(struct ldb_message *msg) log_it(L_INFO, "Entry %s added", ldb_dn_get_linearized(msg->dn)); return 0; } + return -1; +} + +int dap_db_del_msg(struct ldb_dn *ldn) +{ + ldb_transaction_start(ldb); + int status = ldb_delete(ldb, ldn); + if(status != LDB_SUCCESS) { + log_it(L_ERROR, "LDB deleting error: %s", ldb_errstring(ldb)); + ldb_transaction_cancel(ldb); + return -2; + } + else { + ldb_transaction_commit(ldb); + log_it(L_INFO, "Entry %s deleted", ldb_dn_get_linearized(ldn)); + return 0; + } + return -1; } /* path is supposed to have been obtained by smth like @@ -215,6 +237,8 @@ pdap_store_obj_t dap_db_read_file_data(const char *path) /* * Add multiple entries received from remote node to local database. * Since we don't know the size, it must be supplied too + * + * dap_store_size the count records */ int dap_db_merge(pdap_store_obj_t store_obj, int dap_store_size) { @@ -253,6 +277,42 @@ int dap_db_merge(pdap_store_obj_t store_obj, int dap_store_size) return ret; } +/* + * Delete multiple entries from local database. + * + * dap_store_size the count records + */ +int dap_db_delete(pdap_store_obj_t store_obj, int dap_store_size) +{ + int ret = 0; + if(store_obj == NULL) { + log_it(L_ERROR, "Invalid Dap store objects passed"); + return -1; + } + if(ldb_connect(ldb, dap_db_path, 0, NULL) != LDB_SUCCESS) { + log_it(L_ERROR, "Couldn't connect to database"); + return -2; + } + log_it(L_INFO, "We're delete %d records from database", dap_store_size); + struct ldb_message *msg; + int q; + if(dap_store_size == 0) { + dap_store_size = 1; + } + for(q = 0; q < dap_store_size; q++) { + char dn[128]; + memset(dn, '\0', 128); + strcat(dn, "cn="); + strcat(dn, store_obj[q].key); + strcat(dn, ",ou=addrs_leased,dc=kelvin_nodes"); + struct ldb_dn *ldn = ldb_dn_new(mem_ctx, ldb, dn); + ret += dap_db_del_msg(ldn); // accumulation error codes + talloc_free(ldn); + } + return ret; + +} + /* serialization */ /*dap_store_obj_pkt_t *dap_store_packet_single(pdap_store_obj_t store_obj) { diff --git a/dap_chain_global_db_pvt.h b/dap_chain_global_db_pvt.h index 20dc248867a4b0dcd834d6d5d50c7d013c3af91f..bee9db79d1ecc69a09f513bdbe1b89c89ae41247 100644 --- a/dap_chain_global_db_pvt.h +++ b/dap_chain_global_db_pvt.h @@ -14,21 +14,19 @@ typedef struct dap_store_obj { typedef struct dap_store_obj_pkt { /*uint8_t type; - uint8_t sec_size; - uint8_t grp_size; - uint8_t name_size;*/ + uint8_t sec_size; + uint8_t grp_size; + uint8_t name_size;*/ size_t data_size; uint8_t data[]; }__attribute__((packed)) dap_store_obj_pkt_t; -static struct ldb_context *ldb = NULL; -static TALLOC_CTX *mem_ctx = NULL; - int dap_db_init(const char*); void dap_db_deinit(void); int dap_db_add_msg(struct ldb_message *); int dap_db_merge(pdap_store_obj_t, int); +int dap_db_delete(pdap_store_obj_t, int); pdap_store_obj_t dap_db_read_data(const char *query, int *count); pdap_store_obj_t dap_db_read_file_data(const char *); // state of emergency only, if LDB database is inaccessible