From 225600aadffc6fdb188fef230cdab67e1242e3a3 Mon Sep 17 00:00:00 2001 From: gramanas Date: Sun, 22 Apr 2018 18:07:50 +0300 Subject: Add almost done, opt parsing remains --- src/dblayer.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 187 insertions(+), 40 deletions(-) (limited to 'src/dblayer.c') diff --git a/src/dblayer.c b/src/dblayer.c index 98a4d64..b55a760 100644 --- a/src/dblayer.c +++ b/src/dblayer.c @@ -12,18 +12,15 @@ * Give access to the database. * * -------------------------------------------------------------------------- */ -#include -#include -#include - #include "dblayer.h" +#include "dbhelper.h" #include "ckutil.h" const char * const DB_NAME = "/ckdb"; /* figure out the database name */ void make_db_name(char *ret, const char *confPath) { - char db_path[200]; + char db_path[STR_L]; strcpy(db_path, confPath); strcat(db_path, DB_NAME); @@ -32,14 +29,15 @@ void make_db_name(char *ret, const char *confPath) { /* Check if the db file exists*/ int db_exists(const UserOpt *opt) { - char db_path[200]; + char db_path[STR_L]; make_db_name(db_path, opt->confDir); return util_is_file_rw(db_path); } /* check if db has the correct tables */ int check_initialized_DB(sqlite3 *db) { - char *sql = "SELECT * FROM SQLITE_MASTER WHERE type='table';"; + char sql[STR_M]; + dbh_form_query_select_all_tables(sql); sqlite3_stmt *stmt; int rc = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL); @@ -47,13 +45,13 @@ int check_initialized_DB(sqlite3 *db) { int program_table_ok, config_table_ok, rel_table_ok = 0; while (sqlite3_step(stmt) != SQLITE_DONE) { const unsigned char *tmpbuf = sqlite3_column_text(stmt, 1); - if (strcmp((char *)tmpbuf, "PROGRAM") == 0) { + if (strcmp((char *)tmpbuf, TBL_PROGRAM) == 0) { program_table_ok = 1; } - if (strcmp((char *)tmpbuf, "CONFIG") == 0) { + if (strcmp((char *)tmpbuf, TBL_CONFIG) == 0) { config_table_ok = 1; } - if (strcmp((char *)tmpbuf, "REL") == 0) { + if (strcmp((char *)tmpbuf, TBL_REL) == 0) { rel_table_ok = 1; } } @@ -82,7 +80,7 @@ void close_DB(DB *db) { DB init_make_DB(const UserOpt *opt) { sqlite3 *db; - char db_path[200]; + char db_path[STR_L]; int rc; make_db_name(db_path, opt->confDir); @@ -97,7 +95,7 @@ DB init_make_DB(const UserOpt *opt) { DB open_DB(const UserOpt *opt) { sqlite3 *db; int rc; - char db_path[200]; + char db_path[STR_L]; make_db_name(db_path, opt->confDir); rc = sqlite3_open(db_path, &db); @@ -114,18 +112,8 @@ DB open_DB(const UserOpt *opt) { } void init_make_tables(DB *db) { - char * sql = - "CREATE TABLE REL(" - "pId INT NOT NULL," - "cId INT NOT NULL);" - "CREATE TABLE PROGRAM(" - "id INT NOT NULL PRIMARY KEY," - "name TEXT NOT NULL);" - "CREATE TABLE CONFIG(" - "id INT NOT NULL PRIMARY KEY," - "path TEXT NOT NULL," - "secret INT NOT NULL," - "prime INT NOT NULL);"; + char sql[STR_L]; + dbh_form_query_make_tables(sql); char *err_msg = NULL; int rc = sqlite3_exec(db->ptr, sql, 0, 0, &err_msg); @@ -141,10 +129,9 @@ int get_next_valid_id_from_table(DB *db, const char* tableName) { sqlite3_stmt *stmt; int rc; - char sql[100] = "SELECT id FROM "; - strcat(sql, tableName); - strcat(sql, " ORDER BY id;"); - + char sql[STR_M]; + dbh_form_query_select_id_from(sql, tableName); + rc = sqlite3_prepare_v2(db->ptr, sql, -1, &stmt, 0); if (rc != SQLITE_OK) { return -1; @@ -163,33 +150,193 @@ int get_next_valid_id_from_table(DB *db, const char* tableName) { return id; } -void insert_to_program_table(DB *db, const char *name) { +int insert_to_program_table(DB *db, const char *name) { sqlite3_stmt *stmt; int rc; - char * sql = - "INSERT INTO PROGRAM VALUES(?, ?);"; + char sql[STR_L]; + dbh_form_query_insert_program(sql); rc = sqlite3_prepare_v2(db->ptr, sql, -1, &stmt, 0); if (rc != SQLITE_OK) { - printf("Error\n"); - return; + printf("Error while preparing insert to program sql.\n"); + db->error = SQL_ERR_SQLITE; + return -1; } - int id = get_next_valid_id_from_table(db, "PROGRAM"); + int id = get_next_valid_id_from_table(db, TBL_PROGRAM); if (id == -1) { db->error = SQL_ERR_SQLITE; - return; + return -1; } sqlite3_bind_int(stmt, 1, id); sqlite3_bind_text(stmt, 2, name, strlen(name), 0); if (sqlite3_step(stmt) != SQLITE_DONE) { - printf("Error\n"); - return; + printf("Error while excecuting insert to program sql.\n"); + db->error = SQL_ERR_SQLITE; + return -1; } sqlite3_finalize(stmt); + return id; } -int add_insert_program_to_db(DB *db, const char *name) { - insert_to_program_table(db,name); - return 0; +int insert_to_config_table(DB *db, const char *path, const int secret, const int prime) { + sqlite3_stmt *stmt; + int rc; + + char sql[STR_L]; + dbh_form_query_insert_config(sql); + rc = sqlite3_prepare_v2(db->ptr, sql, -1, &stmt, 0); + if (rc != SQLITE_OK) { + printf("Error while preparing insert to config sql.\n"); + db->error = SQL_ERR_SQLITE; + return -1; + } + int id = get_next_valid_id_from_table(db, TBL_CONFIG); + if (id == -1) { + db->error = SQL_ERR_SQLITE; + return -1; + } + sqlite3_bind_int(stmt, 1, id); + sqlite3_bind_text(stmt, 2, path, strlen(path), 0); + sqlite3_bind_int(stmt, 3, secret); + sqlite3_bind_int(stmt, 4, prime); + if (sqlite3_step(stmt) != SQLITE_DONE) { + printf("Error while excecuting insert to config sql.\n"); + db->error = SQL_ERR_SQLITE; + return-1; + } + sqlite3_finalize(stmt); + return id; +} + +int insert_to_rel_table(DB *db, const int pid, const int cid) { + sqlite3_stmt *stmt; + int rc; + + char sql[STR_M]; + dhb_form_query_insert_relationship(sql); + rc = sqlite3_prepare_v2(db->ptr, sql, -1, &stmt, 0); + if (rc != SQLITE_OK) { + db->error = SQL_ERR_SQLITE; + printf("Error while preparing insert to rel sql.\n"); + return -1; + } + sqlite3_bind_int(stmt, 1, pid); + sqlite3_bind_int(stmt, 2, cid); + if (sqlite3_step(stmt) != SQLITE_DONE) { + db->error = SQL_ERR_SQLITE; + printf("Error while excecuting insert to rel sql.\n"); + return-1; + } + sqlite3_finalize(stmt); + return 1; +} + +int program_exists(DB *db, const char* name) { + sqlite3_stmt *stmt; + int rc; + + char sql[STR_M]; + dhb_form_query_find_program(sql); + + rc = sqlite3_prepare_v2(db->ptr, sql, -1, &stmt, 0); + if (rc != SQLITE_OK) { + printf("Error while preparing program_exists sql.\n"); + return -2; + } + sqlite3_bind_text(stmt, 1, name, strlen(name), 0); + int id = -1; + while (sqlite3_step(stmt) == SQLITE_ROW) { + id = sqlite3_column_int(stmt, 0); + break; + } + sqlite3_finalize(stmt); + return id; +} + +int config_exists(DB *db, const int pid, const char* path) { + sqlite3_stmt *stmt; + int rc; + + char sql[STR_M]; + dhb_form_query_find_config(sql); + + rc = sqlite3_prepare_v2(db->ptr, sql, -1, &stmt, 0); + if (rc != SQLITE_OK) { + printf("Error while preparing config_exists sql.\n"); + return -2; + } + sqlite3_bind_text(stmt, 1, path, strlen(path), 0); + int id = -1; + while (sqlite3_step(stmt) == SQLITE_ROW) { + id = sqlite3_column_int(stmt, 0); + break; + } + sqlite3_finalize(stmt); + return id; +} + +int add_insert_relationship(DB *db, const int pid, const int cid) { + // do checks + return insert_to_rel_table(db, pid, cid); +} + +int add_get_or_insert_config_to_db(DB *db, const int pid, const char *path, const int secret, const int prime) { + int cid = config_exists(db, pid, path); + if (cid == -2) { + db->error = SQL_ERR_SQLITE; + return -1; + } + /* If config doesnt exist insert it and return it's cid */ + if (cid == -1) { + return insert_to_config_table(db, path, secret, prime); + } + + /* If it exist it means the user has inserted the same path twice */ + db->error = SQL_CONFIG_PATH_EXISTS; + return -1; +} + +int add_get_or_insert_program_to_db(DB *db, const char *name) { + int pid = program_exists(db, name); + if (pid == -2) { + db->error = SQL_ERR_SQLITE; + return -1; + } + if (pid == -1) { + return insert_to_program_table(db,name); + } + return pid; +} + +int add_transaction_begin(DB *db, const char *progName, + const char* confPath, const int secret, + const int prime) { + __BEGIN_TRANSACTION__ + int pid = add_get_or_insert_program_to_db(db, progName); + if (db->error == SQL_ERR_SQLITE) { + printf("Could not insert program to db.\n"); + close_DB(db); + return 0; + } + int cid = add_get_or_insert_config_to_db(db, pid, confPath, secret, prime); + if (db->error == SQL_ERR_SQLITE) { + printf("Could not insert config to db.\n"); + close_DB(db); + return 0; + } + else if (db->error == SQL_CONFIG_PATH_EXISTS) { + printf("This config already exists in the database.\n"); + close_DB(db); + return 0; + } + add_insert_relationship(db, pid, cid); + if (db->error == SQL_ERR_SQLITE) { + printf("Could not insert config to db.\n"); + close_DB(db); + return 0; + } + __END_TRANSACTION__ + + return 1; } -- cgit v1.2.3