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)
|
||||
project(core
|
||||
VERSION 0.2.11
|
||||
VERSION 0.2.12
|
||||
LANGUAGES C)
|
||||
|
||||
add_executable(core src/main.c)
|
||||
|
|
|
@ -5,7 +5,23 @@
|
|||
|
||||
extern sqlite3 *global_database;
|
||||
|
||||
void
|
||||
database_init();
|
||||
|
||||
void
|
||||
database_free();
|
||||
|
||||
int
|
||||
database_migrate();
|
||||
|
||||
|
||||
int
|
||||
database_transaction_begin();
|
||||
|
||||
void
|
||||
database_transaction_commit();
|
||||
|
||||
void
|
||||
database_transaction_rollback();
|
||||
|
||||
#endif /* CORE_DATABASE_H */
|
||||
|
|
|
@ -7,6 +7,33 @@
|
|||
#include <sql/migration_0.h>
|
||||
|
||||
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
|
||||
database_migrate()
|
||||
|
@ -65,3 +92,32 @@ database_migrate()
|
|||
|
||||
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);
|
||||
|
||||
sqlite3_close(global_database);
|
||||
|
||||
database_free();
|
||||
router_free();
|
||||
status_free();
|
||||
cache_free();
|
||||
|
@ -133,26 +132,9 @@ main(int argc, const char** argv)
|
|||
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 ********************/
|
||||
|
||||
database_init();
|
||||
cache_init();
|
||||
router_init();
|
||||
status_init();
|
||||
|
|
|
@ -116,6 +116,8 @@ controller_db_select(sqlite3_stmt *stmt)
|
|||
int
|
||||
controller_save(controller_t *controller)
|
||||
{
|
||||
int opened_transaction = database_transaction_begin();
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
if(controller->id)
|
||||
{
|
||||
|
@ -138,6 +140,11 @@ controller_save(controller_t *controller)
|
|||
{
|
||||
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
||||
}
|
||||
|
||||
if(opened_transaction)
|
||||
{
|
||||
database_transaction_rollback();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -145,6 +152,11 @@ controller_save(controller_t *controller)
|
|||
{
|
||||
controller->id = sqlite3_last_insert_rowid(global_database);
|
||||
}
|
||||
|
||||
if(opened_transaction)
|
||||
{
|
||||
database_transaction_commit();
|
||||
}
|
||||
}
|
||||
|
||||
cache_invalidate_controller(controller->id);
|
||||
|
|
|
@ -126,6 +126,8 @@ relay_db_select(sqlite3_stmt *stmt)
|
|||
int
|
||||
relay_save(relay_t *relay)
|
||||
{
|
||||
int opened_transaction = database_transaction_begin();
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
if(relay->id)
|
||||
{
|
||||
|
@ -148,6 +150,11 @@ relay_save(relay_t *relay)
|
|||
{
|
||||
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
||||
}
|
||||
|
||||
if(opened_transaction)
|
||||
{
|
||||
database_transaction_rollback();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -155,16 +162,20 @@ relay_save(relay_t *relay)
|
|||
{
|
||||
relay->id = sqlite3_last_insert_rowid(global_database);
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER_DEBUG("cleaning relay_schedule junction\n");
|
||||
junction_relay_schedule_remove_for_relay(relay->id);
|
||||
|
||||
LOGGER_DEBUG("cleaning relay_schedule junction\n");
|
||||
junction_relay_schedule_remove_for_relay(relay->id);
|
||||
LOGGER_DEBUG("rebuilding relay_schedule junction\n");
|
||||
for(int i = 0; i < 7; ++i)
|
||||
{
|
||||
junction_relay_schedule_insert(i, relay->id, relay->schedules[i]->id);
|
||||
}
|
||||
|
||||
LOGGER_DEBUG("rebuilding relay_schedule junction\n");
|
||||
for(int i = 0; i < 7; ++i)
|
||||
{
|
||||
junction_relay_schedule_insert(i, relay->id, relay->schedules[i]->id);
|
||||
if(opened_transaction)
|
||||
{
|
||||
database_transaction_commit();
|
||||
}
|
||||
}
|
||||
|
||||
cache_invalidate_relay(relay->id);
|
||||
|
|
|
@ -112,6 +112,8 @@ schedule_db_select(sqlite3_stmt *stmt)
|
|||
int
|
||||
schedule_save(schedule_t *schedule)
|
||||
{
|
||||
int opened_transaction = database_transaction_begin();
|
||||
|
||||
sqlite3_stmt *stmt;
|
||||
if(schedule->id)
|
||||
{
|
||||
|
@ -134,6 +136,11 @@ schedule_save(schedule_t *schedule)
|
|||
{
|
||||
LOGGER_ERR("error updating data: %s\n", sqlite3_errmsg(global_database));
|
||||
}
|
||||
|
||||
if(opened_transaction)
|
||||
{
|
||||
database_transaction_rollback();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -141,6 +148,11 @@ schedule_save(schedule_t *schedule)
|
|||
{
|
||||
schedule->id = sqlite3_last_insert_rowid(global_database);
|
||||
}
|
||||
|
||||
if(opened_transaction)
|
||||
{
|
||||
database_transaction_commit();
|
||||
}
|
||||
}
|
||||
|
||||
cache_invalidate_schedule(schedule->id);
|
||||
|
|
|
@ -8,7 +8,7 @@ alias valgrind_emgauwa="valgrind $2 --log-file=$working_dir/valgrind.log"
|
|||
|
||||
|
||||
rm -rf $working_bak
|
||||
mv $working_dir $working_bak
|
||||
[ -d $working_dir ] && mv $working_dir $working_bak
|
||||
|
||||
mkdir -p $working_dir
|
||||
cd $working_dir
|
||||
|
@ -53,7 +53,7 @@ core_id=$!
|
|||
|
||||
|
||||
# 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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue