Skip to content
Snippets Groups Projects
Commit 9e7db0a9 authored by dmitriy.gerasimov's avatar dmitriy.gerasimov
Browse files

Merge branch 'feature-2621' into 'master'

[+] Added a flush command handler for the cuttdb and sqlite database. This...

See merge request !11
parents 6c0ed735 ff16a86e
No related branches found
No related tags found
1 merge request!11[+] Added a flush command handler for the cuttdb and sqlite database. This...
......@@ -208,6 +208,17 @@ void dap_chain_global_db_deinit(void)
}
/**
* @brief dap_chain_global_db_flush
* @return
*/
int dap_chain_global_db_flush(void){
lock();
int res = dap_db_driver_flush();
unlock();
return res;
}
/**
* Get entry from base
*
......
......@@ -26,6 +26,10 @@ typedef void (*dap_global_db_obj_callback_notify_t) (void * a_arg, const char a_
const char * a_key, const void * a_value,
const size_t a_value_len);
/**
* Flush DB
*/
int dap_chain_global_db_flush(void);
/**
* Clean struct dap_global_db_obj_t
......
......@@ -145,6 +145,11 @@ void dap_db_driver_deinit(void)
}
}
int dap_db_driver_flush(void)
{
return s_drv_callback.flush();
}
dap_store_obj_t* dap_store_obj_copy(dap_store_obj_t *a_store_obj, size_t a_store_count)
{
if(!a_store_obj || !a_store_count)
......
......@@ -61,6 +61,7 @@ typedef struct dap_db_driver_callbacks {
dap_db_driver_callback_t transaction_start;
dap_db_driver_callback_t transaction_end;
dap_db_driver_callback_t deinit;
dap_db_driver_callback_t flush;
} dap_db_driver_callbacks_t;
......@@ -69,6 +70,7 @@ void dap_db_driver_deinit(void);
dap_store_obj_t* dap_store_obj_copy(dap_store_obj_t *a_store_obj, size_t a_store_count);
void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count);
int dap_db_driver_flush(void)
char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size);
......
......@@ -230,6 +230,7 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_
a_drv_callback->read_store_obj = dap_db_driver_cdb_read_store_obj;
a_drv_callback->read_cond_store_obj = dap_db_driver_cdb_read_cond_store_obj;
a_drv_callback->deinit = dap_db_driver_cdb_deinit;
a_drv_callback->flush = dap_db_driver_cdb_flush;
closedir(dir);
return CDB_SUCCESS;
......@@ -274,6 +275,42 @@ int dap_db_driver_cdb_deinit() {
return CDB_SUCCESS;
}
int dap_db_driver_cdb_flush(void){
log_it(L_DEBUG, "Start flush cuttdb.");
//CLOSE
cdb_instance *cur_cdb, *tmp;
HASH_ITER(hh, s_cdb, cur_cdb, tmp) {
DAP_DELETE(cur_cdb->local_group);
cdb_destroy(cur_cdb->cdb);
HASH_DEL(s_cdb, cur_cdb);
DAP_DELETE(cur_cdb);
}
//SYNC
#ifndef _WIN32
sync();
#endif
//OPEN
struct dirent *d;
DIR *dir = opendir(s_cdb_path);
if (!dir) {
log_it(L_ERROR, "Couldn't open db directory");
return -1;
}
for (d = readdir(dir); d; d = readdir(dir)) {
if (!dap_strcmp(d->d_name, ".") || !dap_strcmp(d->d_name, "..")) {
continue;
}
pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_CREAT | CDB_PAGEWARMUP);
if (!l_cdb_i) {
dap_db_driver_cdb_deinit();
closedir(dir);
return -2;
}
}
closedir(dir);
return 0;
}
dap_store_obj_t *dap_db_driver_cdb_read_last_store_obj(const char* a_group) {
if (!a_group) {
return NULL;
......
......@@ -39,6 +39,7 @@ typedef struct _cdb_record {
int dap_db_driver_cdb_init(const char*, dap_db_driver_callbacks_t*);
int dap_db_driver_cdb_deinit();
int dap_db_driver_cdb_flush(void);
int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t);
......
......@@ -32,6 +32,7 @@
#define LOG_TAG "db_sqlite"
static sqlite3 *s_db = NULL;
static char *s_filename_db = NULL;
// Value of one field in the table
typedef struct _SQLITE_VALUE_
......@@ -104,6 +105,8 @@ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks
a_drv_callback->transaction_start = dap_db_driver_sqlite_start_transaction;
a_drv_callback->transaction_end = dap_db_driver_sqlite_end_transaction;
a_drv_callback->deinit = dap_db_driver_sqlite_deinit;
a_drv_callback->flush = dap_db_driver_sqlite_flush;
s_filename_db = strdup(a_filename_db);
}
return l_ret;
}
......@@ -205,6 +208,30 @@ bool dap_db_driver_sqlite_set_pragma(sqlite3 *a_db, char *a_param, char *a_mode)
return false;
}
int dap_db_driver_sqlite_flush()
{
log_it(L_DEBUG, "Start flush sqlite data base.");
dap_db_driver_sqlite_close(s_db);
char *l_error_message;
s_db = dap_db_driver_sqlite_open(s_filename_db, SQLITE_OPEN_READWRITE, &l_error_message);
if(!s_db) {
log_it(L_ERROR, "Can't init sqlite err=%d", l_error_message);
dap_db_driver_sqlite_free(l_error_message);
return -3;
}
#ifndef _WIN32
sync();
#endif
if(!dap_db_driver_sqlite_set_pragma(s_db, "synchronous", "NORMAL")) // 0 | OFF | 1 | NORMAL | 2 | FULL
log_it(L_WARNING, "Can't set new synchronous mode\n");
if(!dap_db_driver_sqlite_set_pragma(s_db, "journal_mode", "OFF")) // DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
log_it(L_WARNING, "Can't set new journal mode\n");
if(!dap_db_driver_sqlite_set_pragma(s_db, "page_size", "1024")) // DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
log_it(L_WARNING, "Can't set page_size\n");
return 0;
}
/**
* Execute SQL query to database that does not return data
*
......
......@@ -32,6 +32,7 @@ sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, cha
void dap_db_driver_sqlite_close(sqlite3 *l_db);
void dap_db_driver_sqlite_free(char *memory);
bool dap_db_driver_sqlite_set_pragma(sqlite3 *a_db, char *a_param, char *a_mode);
int dap_db_driver_sqlite_flush(void);
// ** SQLite callbacks **
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment