add: basic macro functions
add: better migration handling (transactions)
This commit is contained in:
		
							parent
							
								
									7275d66c86
								
							
						
					
					
						commit
						f67b7e9e0f
					
				
					 7 changed files with 122 additions and 36 deletions
				
			
		| 
						 | 
					@ -44,24 +44,18 @@ add_custom_target(run
 | 
				
			||||||
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
 | 
					    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_custom_target(test
 | 
				
			||||||
 | 
					    COMMAND ./run_tests.sh ${CMAKE_BINARY_DIR}/core "--leak-check=full --show-leak-kinds=all --track-origins=yes"
 | 
				
			||||||
 | 
					    DEPENDS core
 | 
				
			||||||
 | 
					    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_custom_target(docs
 | 
					add_custom_target(docs
 | 
				
			||||||
    COMMAND doxygen
 | 
					    COMMAND doxygen
 | 
				
			||||||
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
 | 
					    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_custom_target(test
 | 
					IF(CMAKE_BUILD_TYPE MATCHES Debug)
 | 
				
			||||||
    COMMAND ./run_tests.sh ${CMAKE_BINARY_DIR}/core "--leak-check=full --show-leak-kinds=all --track-origins=yes"
 | 
					 | 
				
			||||||
    DEPENDS core
 | 
					 | 
				
			||||||
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
add_custom_target(test-callgrind
 | 
					 | 
				
			||||||
    COMMAND ./run_tests.sh ${CMAKE_BINARY_DIR}/core "--tool=callgrind"
 | 
					 | 
				
			||||||
    DEPENDS core
 | 
					 | 
				
			||||||
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
 | 
					 | 
				
			||||||
    message("debug mode")
 | 
					    message("debug mode")
 | 
				
			||||||
    add_custom_target(debug
 | 
					    add_custom_target(debug
 | 
				
			||||||
        COMMAND valgrind -s ./core start
 | 
					        COMMAND valgrind -s ./core start
 | 
				
			||||||
| 
						 | 
					@ -83,4 +77,10 @@ IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
 | 
				
			||||||
        DEPENDS test
 | 
					        DEPENDS test
 | 
				
			||||||
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
 | 
					        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG)
 | 
					
 | 
				
			||||||
 | 
					    add_custom_target(test-callgrind
 | 
				
			||||||
 | 
					        COMMAND ./run_tests.sh ${CMAKE_BINARY_DIR}/core "--tool=callgrind"
 | 
				
			||||||
 | 
					        DEPENDS core
 | 
				
			||||||
 | 
					        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					ENDIF(CMAKE_BUILD_TYPE MATCHES Debug)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								include/models/junction_macro.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								include/models/junction_macro.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					#ifndef CORE_JUNCTION_MACRO_H
 | 
				
			||||||
 | 
					#define CORE_JUNCTION_MACRO_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					junction_macro_insert(int macro_id, int relay_id, int schedule_id, uint8_t weekday);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CORE_JUNCTION_MACRO_H */
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,5 @@
 | 
				
			||||||
 | 
					-- a key-value table used for the json-cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE cache (
 | 
					CREATE TABLE cache (
 | 
				
			||||||
   key          STRING
 | 
					   key          STRING
 | 
				
			||||||
                PRIMARY KEY,
 | 
					                PRIMARY KEY,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,6 @@
 | 
				
			||||||
create table controllers
 | 
					-- base migration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE controllers
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    id      INTEGER
 | 
					    id      INTEGER
 | 
				
			||||||
            PRIMARY KEY
 | 
					            PRIMARY KEY
 | 
				
			||||||
| 
						 | 
					@ -14,7 +16,7 @@ create table controllers
 | 
				
			||||||
                NOT NULL
 | 
					                NOT NULL
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table relays
 | 
					CREATE TABLE relays
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    id              INTEGER
 | 
					    id              INTEGER
 | 
				
			||||||
                    PRIMARY KEY
 | 
					                    PRIMARY KEY
 | 
				
			||||||
| 
						 | 
					@ -28,7 +30,7 @@ create table relays
 | 
				
			||||||
                    ON DELETE CASCADE
 | 
					                    ON DELETE CASCADE
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table schedules
 | 
					CREATE TABLE schedules
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    id      INTEGER
 | 
					    id      INTEGER
 | 
				
			||||||
            PRIMARY KEY
 | 
					            PRIMARY KEY
 | 
				
			||||||
| 
						 | 
					@ -40,7 +42,7 @@ create table schedules
 | 
				
			||||||
    periods BLOB
 | 
					    periods BLOB
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table tags
 | 
					CREATE TABLE tags
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    id      INTEGER
 | 
					    id      INTEGER
 | 
				
			||||||
            PRIMARY KEY
 | 
					            PRIMARY KEY
 | 
				
			||||||
| 
						 | 
					@ -50,7 +52,7 @@ create table tags
 | 
				
			||||||
            UNIQUE
 | 
					            UNIQUE
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table junction_tag
 | 
					CREATE TABLE junction_tag
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    tag_id          INTEGER
 | 
					    tag_id          INTEGER
 | 
				
			||||||
                    NOT NULL
 | 
					                    NOT NULL
 | 
				
			||||||
| 
						 | 
					@ -64,7 +66,7 @@ create table junction_tag
 | 
				
			||||||
                    ON DELETE CASCADE
 | 
					                    ON DELETE CASCADE
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create table junction_relay_schedule
 | 
					CREATE TABLE junction_relay_schedule
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    weekday         SMALLINT
 | 
					    weekday         SMALLINT
 | 
				
			||||||
                    NOT NULL,
 | 
					                    NOT NULL,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										28
									
								
								sql/migration_1.sql
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								sql/migration_1.sql
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					-- migration to add macros
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE macros
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    id      INTEGER
 | 
				
			||||||
 | 
					            PRIMARY KEY
 | 
				
			||||||
 | 
					            AUTOINCREMENT,
 | 
				
			||||||
 | 
					    uid     BLOB
 | 
				
			||||||
 | 
					            NOT NULL
 | 
				
			||||||
 | 
					            UNIQUE,
 | 
				
			||||||
 | 
					    name    VARCHAR(128)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE junction_macro
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    macro_id    INTEGER
 | 
				
			||||||
 | 
					                NOT NULL
 | 
				
			||||||
 | 
					                REFERENCES macros (id)
 | 
				
			||||||
 | 
					                ON DELETE CASCADE,
 | 
				
			||||||
 | 
					    relay_id    INTEGER
 | 
				
			||||||
 | 
					                REFERENCES relays (id)
 | 
				
			||||||
 | 
					                ON DELETE CASCADE,
 | 
				
			||||||
 | 
					    schedule_id INTEGER
 | 
				
			||||||
 | 
					                REFERENCES schedules (id)
 | 
				
			||||||
 | 
					                ON DELETE CASCADE,
 | 
				
			||||||
 | 
					    weekday     SMALLINT
 | 
				
			||||||
 | 
					                NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
#include <database.h>
 | 
					#include <database.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sql/migration_0.h>
 | 
					#include <sql/migration_0.h>
 | 
				
			||||||
 | 
					#include <sql/migration_1.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sqlite3 *global_database;
 | 
					sqlite3 *global_database;
 | 
				
			||||||
static int in_transaction;
 | 
					static int in_transaction;
 | 
				
			||||||
| 
						 | 
					@ -32,11 +33,35 @@ database_free()
 | 
				
			||||||
    sqlite3_close(global_database);
 | 
					    sqlite3_close(global_database);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					database_migrate_step_simple(int level, const char* sql_migration)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    LOGGER_INFO("migrating LEVEL %d\n", level);
 | 
				
			||||||
 | 
					    char* err_msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sqlite3_exec(global_database, "BEGIN TRANSACTION;", NULL, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int rc = sqlite3_exec(global_database, sql_migration, NULL, NULL, &err_msg);
 | 
				
			||||||
 | 
					    if(rc)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOGGER_CRIT("couldn't migrate LEVEL %d (%s)\n", level, err_msg);
 | 
				
			||||||
 | 
					        sqlite3_exec(global_database, "ROLLBACK TRANSACTION;", NULL, NULL, NULL);
 | 
				
			||||||
 | 
					        exit(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOGGER_DEBUG("storing new user_version %d\n", level + 1);
 | 
				
			||||||
 | 
					    char pragma_query[32];
 | 
				
			||||||
 | 
					    sprintf(pragma_query, "PRAGMA user_version=%d;", level + 1);
 | 
				
			||||||
 | 
					    sqlite3_exec(global_database, pragma_query, 0, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sqlite3_exec(global_database, "COMMIT TRANSACTION;", NULL, NULL, NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
database_migrate()
 | 
					database_migrate()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint16_t version_num = 0;
 | 
					    uint16_t version_num = 0;
 | 
				
			||||||
    int s, rc;
 | 
					    int s;
 | 
				
			||||||
    sqlite3_stmt *stmt;
 | 
					    sqlite3_stmt *stmt;
 | 
				
			||||||
    sqlite3_prepare_v2(global_database, "PRAGMA user_version;", -1, &stmt, NULL);
 | 
					    sqlite3_prepare_v2(global_database, "PRAGMA user_version;", -1, &stmt, NULL);
 | 
				
			||||||
    s = sqlite3_step(stmt);
 | 
					    s = sqlite3_step(stmt);
 | 
				
			||||||
| 
						 | 
					@ -49,31 +74,20 @@ database_migrate()
 | 
				
			||||||
        version_num = 0;
 | 
					        version_num = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint16_t new_version_num = version_num;
 | 
					 | 
				
			||||||
    char* err_msg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sqlite3_finalize(stmt);
 | 
					    sqlite3_finalize(stmt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch(version_num)
 | 
					    switch(version_num)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        case 0:
 | 
					        case 0:
 | 
				
			||||||
            LOGGER_INFO("migrating LEVEL 0\n");
 | 
					            database_migrate_step_simple(0, (const char*)sql_migration_0_sql);
 | 
				
			||||||
            rc = sqlite3_exec(global_database, (const char *)sql_migration_0_sql, NULL, NULL, &err_msg);
 | 
					            __attribute__ ((fallthrough));
 | 
				
			||||||
            if(rc)
 | 
					        case 1:
 | 
				
			||||||
            {
 | 
					            database_migrate_step_simple(1, (const char*)sql_migration_1_sql);
 | 
				
			||||||
                LOGGER_CRIT("couldn't migrate LEVEL 0 (%s)\n", err_msg);
 | 
					            __attribute__ ((fallthrough));
 | 
				
			||||||
                exit(1);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            new_version_num = 1;
 | 
					 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char pragma_query[32];
 | 
					 | 
				
			||||||
    sprintf(pragma_query, "PRAGMA user_version=%d;", new_version_num);
 | 
					 | 
				
			||||||
    sqlite3_exec(global_database, pragma_query, 0, 0, 0);
 | 
					 | 
				
			||||||
    LOGGER_DEBUG("storing new user_version %d\n", new_version_num);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/models/junction_macro.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/models/junction_macro.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <models/junction_macro.h>
 | 
				
			||||||
 | 
					#include <logger.h>
 | 
				
			||||||
 | 
					#include <macros.h>
 | 
				
			||||||
 | 
					#include <database.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					junction_macro_insert(int macro_id, int relay_id, int schedule_id, uint8_t weekday)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int rc;
 | 
				
			||||||
 | 
					    sqlite3_stmt *stmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sqlite3_prepare_v2(global_database, "INSERT INTO junction_macro(macro_id, schedule_id, relay_id, weekday) values (?1, ?2, ?3);", -1, &stmt, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sqlite3_bind_int(stmt, 1, macro_id);
 | 
				
			||||||
 | 
					    sqlite3_bind_int(stmt, 2, relay_id);
 | 
				
			||||||
 | 
					    sqlite3_bind_int(stmt, 3, schedule_id);
 | 
				
			||||||
 | 
					    sqlite3_bind_int(stmt, 4, weekday);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rc = sqlite3_step(stmt);
 | 
				
			||||||
 | 
					    if (rc != SQLITE_DONE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOGGER_ERR("error inserting data: %s", sqlite3_errmsg(global_database));
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sqlite3_finalize(stmt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue