add: database transactions
This commit is contained in:
parent
7fa462ef1d
commit
7c6eed8dc2
8 changed files with 119 additions and 30 deletions
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required (VERSION 3.7)
|
cmake_minimum_required (VERSION 3.7)
|
||||||
project(core
|
project(core
|
||||||
VERSION 0.2.11
|
VERSION 0.2.12
|
||||||
LANGUAGES C)
|
LANGUAGES C)
|
||||||
|
|
||||||
add_executable(core src/main.c)
|
add_executable(core src/main.c)
|
||||||
|
|
|
@ -5,7 +5,23 @@
|
||||||
|
|
||||||
extern sqlite3 *global_database;
|
extern sqlite3 *global_database;
|
||||||
|
|
||||||
|
void
|
||||||
|
database_init();
|
||||||
|
|
||||||
|
void
|
||||||
|
database_free();
|
||||||
|
|
||||||
int
|
int
|
||||||
database_migrate();
|
database_migrate();
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
database_transaction_begin();
|
||||||
|
|
||||||
|
void
|
||||||
|
database_transaction_commit();
|
||||||
|
|
||||||
|
void
|
||||||
|
database_transaction_rollback();
|
||||||
|
|
||||||
#endif /* CORE_DATABASE_H */
|
#endif /* CORE_DATABASE_H */
|
||||||
|
|
|
@ -7,6 +7,33 @@
|
||||||
#include <sql/migration_0.h>
|
#include <sql/migration_0.h>
|
||||||
|
|
||||||
sqlite3 *global_database;
|
sqlite3 *global_database;
|
||||||
|
static int in_transaction;
|
||||||
|
|
||||||
|
void
|
||||||
|
database_init()
|
||||||
|
{
|
||||||
|
int rc = sqlite3_open(global_config.database, &global_database);
|
||||||
|
|
||||||
|
if(rc)
|
||||||
|
{
|
||||||
|
LOGGER_CRIT("can't open database: %s\n", sqlite3_errmsg(global_database));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(database_migrate())
|
||||||
|
{
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlite3_exec(global_database, "PRAGMA foreign_keys = ON", 0, 0, 0);
|
||||||
|
in_transaction = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
database_free()
|
||||||
|
{
|
||||||
|
sqlite3_close(global_database);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
database_migrate()
|
database_migrate()
|
||||||
|
@ -65,3 +92,32 @@ database_migrate()
|
||||||
|
|
||||||
return rc != SQLITE_DONE;
|
return rc != SQLITE_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
database_transaction_begin()
|
||||||
|
{
|
||||||
|
if(!in_transaction)
|
||||||
|
{
|
||||||
|
LOGGER_DEBUG("beginning transaction\n");
|
||||||
|
sqlite3_exec(global_database, "BEGIN TRANSACTION;", NULL, NULL, NULL);
|
||||||
|
in_transaction = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
database_transaction_commit()
|
||||||
|
{
|
||||||
|
LOGGER_DEBUG("commiting transaction\n");
|
||||||
|
sqlite3_exec(global_database, "COMMIT TRANSACTION;", NULL, NULL, NULL);
|
||||||
|
in_transaction = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
database_transaction_rollback()
|
||||||
|
{
|
||||||
|
LOGGER_DEBUG("rolling back transaction\n");
|
||||||
|
sqlite3_exec(global_database, "ROLLBACK TRANSACTION;", NULL, NULL, NULL);
|
||||||
|
in_transaction = 0;
|
||||||
|
}
|
||||||
|
|
22
src/main.c
22
src/main.c
|
@ -27,8 +27,7 @@ terminate(int signum)
|
||||||
|
|
||||||
mg_mgr_free(&mgr);
|
mg_mgr_free(&mgr);
|
||||||
|
|
||||||
sqlite3_close(global_database);
|
database_free();
|
||||||
|
|
||||||
router_free();
|
router_free();
|
||||||
status_free();
|
status_free();
|
||||||
cache_free();
|
cache_free();
|
||||||
|
@ -133,26 +132,9 @@ main(int argc, const char** argv)
|
||||||
helper_drop_privileges();
|
helper_drop_privileges();
|
||||||
|
|
||||||
|
|
||||||
/******************** SETUP DATABASE ********************/
|
|
||||||
|
|
||||||
int rc = sqlite3_open(global_config.database, &global_database);
|
|
||||||
|
|
||||||
if(rc)
|
|
||||||
{
|
|
||||||
LOGGER_CRIT("can't open database: %s\n", sqlite3_errmsg(global_database));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(database_migrate())
|
|
||||||
{
|
|
||||||
terminate(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlite3_exec(global_database, "PRAGMA foreign_keys = ON", 0, 0, 0);
|
|
||||||
|
|
||||||
|
|
||||||
/******************** INIT COMPONENTS ********************/
|
/******************** INIT COMPONENTS ********************/
|
||||||
|
|
||||||
|
database_init();
|
||||||
cache_init();
|
cache_init();
|
||||||
router_init();
|
router_init();
|
||||||
status_init();
|
status_init();
|
||||||
|
|
|
@ -116,6 +116,8 @@ controller_db_select(sqlite3_stmt *stmt)
|
||||||
int
|
int
|
||||||
controller_save(controller_t *controller)
|
controller_save(controller_t *controller)
|
||||||
{
|
{
|
||||||
|
int opened_transaction = database_transaction_begin();
|
||||||
|
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
if(controller->id)
|
if(controller->id)
|
||||||
{
|
{
|
||||||
|
@ -138,6 +140,11 @@ controller_save(controller_t *controller)
|
||||||
{
|
{
|
||||||
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(opened_transaction)
|
||||||
|
{
|
||||||
|
database_transaction_rollback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -145,6 +152,11 @@ controller_save(controller_t *controller)
|
||||||
{
|
{
|
||||||
controller->id = sqlite3_last_insert_rowid(global_database);
|
controller->id = sqlite3_last_insert_rowid(global_database);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(opened_transaction)
|
||||||
|
{
|
||||||
|
database_transaction_commit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_invalidate_controller(controller->id);
|
cache_invalidate_controller(controller->id);
|
||||||
|
|
|
@ -126,6 +126,8 @@ relay_db_select(sqlite3_stmt *stmt)
|
||||||
int
|
int
|
||||||
relay_save(relay_t *relay)
|
relay_save(relay_t *relay)
|
||||||
{
|
{
|
||||||
|
int opened_transaction = database_transaction_begin();
|
||||||
|
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
if(relay->id)
|
if(relay->id)
|
||||||
{
|
{
|
||||||
|
@ -148,6 +150,11 @@ relay_save(relay_t *relay)
|
||||||
{
|
{
|
||||||
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(opened_transaction)
|
||||||
|
{
|
||||||
|
database_transaction_rollback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -155,8 +162,6 @@ relay_save(relay_t *relay)
|
||||||
{
|
{
|
||||||
relay->id = sqlite3_last_insert_rowid(global_database);
|
relay->id = sqlite3_last_insert_rowid(global_database);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOGGER_DEBUG("cleaning relay_schedule junction\n");
|
LOGGER_DEBUG("cleaning relay_schedule junction\n");
|
||||||
junction_relay_schedule_remove_for_relay(relay->id);
|
junction_relay_schedule_remove_for_relay(relay->id);
|
||||||
|
@ -167,6 +172,12 @@ relay_save(relay_t *relay)
|
||||||
junction_relay_schedule_insert(i, relay->id, relay->schedules[i]->id);
|
junction_relay_schedule_insert(i, relay->id, relay->schedules[i]->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(opened_transaction)
|
||||||
|
{
|
||||||
|
database_transaction_commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cache_invalidate_relay(relay->id);
|
cache_invalidate_relay(relay->id);
|
||||||
status_reload_entry(relay->id);
|
status_reload_entry(relay->id);
|
||||||
|
|
||||||
|
|
|
@ -112,6 +112,8 @@ schedule_db_select(sqlite3_stmt *stmt)
|
||||||
int
|
int
|
||||||
schedule_save(schedule_t *schedule)
|
schedule_save(schedule_t *schedule)
|
||||||
{
|
{
|
||||||
|
int opened_transaction = database_transaction_begin();
|
||||||
|
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
if(schedule->id)
|
if(schedule->id)
|
||||||
{
|
{
|
||||||
|
@ -134,6 +136,11 @@ schedule_save(schedule_t *schedule)
|
||||||
{
|
{
|
||||||
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(opened_transaction)
|
||||||
|
{
|
||||||
|
database_transaction_rollback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -141,6 +148,11 @@ schedule_save(schedule_t *schedule)
|
||||||
{
|
{
|
||||||
schedule->id = sqlite3_last_insert_rowid(global_database);
|
schedule->id = sqlite3_last_insert_rowid(global_database);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(opened_transaction)
|
||||||
|
{
|
||||||
|
database_transaction_commit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_invalidate_schedule(schedule->id);
|
cache_invalidate_schedule(schedule->id);
|
||||||
|
|
|
@ -8,7 +8,7 @@ alias valgrind_emgauwa="valgrind $2 --log-file=$working_dir/valgrind.log"
|
||||||
|
|
||||||
|
|
||||||
rm -rf $working_bak
|
rm -rf $working_bak
|
||||||
mv $working_dir $working_bak
|
[ -d $working_dir ] && mv $working_dir $working_bak
|
||||||
|
|
||||||
mkdir -p $working_dir
|
mkdir -p $working_dir
|
||||||
cd $working_dir
|
cd $working_dir
|
||||||
|
@ -53,7 +53,7 @@ core_id=$!
|
||||||
|
|
||||||
|
|
||||||
# wait for start
|
# wait for start
|
||||||
sleep 3;
|
sleep 5;
|
||||||
curl -s -o /dev/null --retry 5 --retry-all-errors --retry-connrefused http://localhost:5000/api/v1/tags
|
curl -s -o /dev/null --retry 5 --retry-all-errors --retry-connrefused http://localhost:5000/api/v1/tags
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue