From ed063a74836af98ff6a6d986e97b7076a15a5eb1 Mon Sep 17 00:00:00 2001 From: theBreadCompany Date: Sun, 8 Jun 2025 12:38:33 +0200 Subject: [PATCH] clang-format --- src/main/include/models.h | 38 ++- src/main/include/sql.h | 56 ++-- src/main/include/util.h | 73 ++--- src/main/main.c | 628 ++++++++++++++++++++------------------ src/main/models.c | 474 ++++++++++++++-------------- src/main/sql.c | 181 ++++++----- src/main/util.c | 157 +++++----- 7 files changed, 844 insertions(+), 763 deletions(-) diff --git a/src/main/include/models.h b/src/main/include/models.h index 2e402e0..be00e55 100644 --- a/src/main/include/models.h +++ b/src/main/include/models.h @@ -5,9 +5,9 @@ #include "util.h" struct klist_user { - ssize_t id; - unsigned char *name; - ssize_t local_id; + ssize_t id; + unsigned char *name; + ssize_t local_id; }; typedef struct klist_user klist_user; @@ -21,12 +21,11 @@ void klist_user_save(klist *, klist_user *); void klist_user_delete(klist *, klist_user *); void klist_user_deinit(klist_user *); - struct klist_list { - ssize_t id; - unsigned char *name; - unsigned char *desc; - bool is_preset; + ssize_t id; + unsigned char *name; + unsigned char *desc; + bool is_preset; }; typedef struct klist_list klist_list; @@ -39,12 +38,11 @@ void klist_list_save(klist *, klist_list *); void klist_list_delete(klist *, klist_list *); void klist_list_deinit(klist_list *); - struct klist_stage { - ssize_t id; - unsigned char *name; - unsigned char *desc; - ssize_t list_id; + ssize_t id; + unsigned char *name; + unsigned char *desc; + ssize_t list_id; }; typedef struct klist_stage klist_stage; @@ -56,15 +54,13 @@ void klist_stage_save(klist *, klist_stage *); void klist_stage_delete(klist *, klist_stage *); void klist_stage_deinit(klist_stage *); - struct klist_task { - ssize_t id; - unsigned char *name; - unsigned char *desc; - int stage_id; - time_t due; - int target_stage; - + ssize_t id; + unsigned char *name; + unsigned char *desc; + int stage_id; + time_t due; + int target_stage; }; typedef struct klist_task klist_task; diff --git a/src/main/include/sql.h b/src/main/include/sql.h index a60688e..125f11e 100644 --- a/src/main/include/sql.h +++ b/src/main/include/sql.h @@ -2,34 +2,34 @@ #include enum KLIST_SQL { - INIT, - ADD_LOGIN, - ADD_USER, - GET_USER, - GET_USER_BY_LOCAL, - GET_USERS, - MOD_USER_NAME, - DEL_USER, - ADD_LIST, - GET_LIST, - GET_LISTS, - GET_LISTS_BY_USER, - GET_LISTS_BY_USER_NAME, - MOD_LIST_NAME, - DEL_LIST, - ADD_STAGE, - GET_STAGE, - GET_STAGES_FOR_LIST, - DEL_STAGE, - ADD_TASK, - GET_TASK, - GET_TASKS, - GET_TASKS_FOR_LIST, - GET_TASKS_FOR_LIST_BY_NAME, - MOD_TASK_NAME, - MOD_TASK_DESCRIPTION, - DEL_TASK, - _KLIST_SQL_COUNT + INIT, + ADD_LOGIN, + ADD_USER, + GET_USER, + GET_USER_BY_LOCAL, + GET_USERS, + MOD_USER_NAME, + DEL_USER, + ADD_LIST, + GET_LIST, + GET_LISTS, + GET_LISTS_BY_USER, + GET_LISTS_BY_USER_NAME, + MOD_LIST_NAME, + DEL_LIST, + ADD_STAGE, + GET_STAGE, + GET_STAGES_FOR_LIST, + DEL_STAGE, + ADD_TASK, + GET_TASK, + GET_TASKS, + GET_TASKS_FOR_LIST, + GET_TASKS_FOR_LIST_BY_NAME, + MOD_TASK_NAME, + MOD_TASK_DESCRIPTION, + DEL_TASK, + _KLIST_SQL_COUNT }; const char *klist_sql_get(const enum KLIST_SQL); diff --git a/src/main/include/util.h b/src/main/include/util.h index d539acf..a572cda 100644 --- a/src/main/include/util.h +++ b/src/main/include/util.h @@ -8,87 +8,76 @@ */ enum klist_command { - USER, - LIST, - TASK, + USER, + LIST, + TASK, }; struct klist { - sqlite3 *db; - sqlite3_stmt **stmts; - u_int cmd; - void *cmd_ctx; - int error; - + sqlite3 *db; + sqlite3_stmt **stmts; + u_int cmd; + void *cmd_ctx; + int error; }; typedef struct klist klist; klist *klist_init(char *db); void klist_deinit(klist *list); - -enum klist_user_command { - USER_GET, - USER_CREATE, - USER_DELETE -}; +enum klist_user_command { USER_GET, USER_CREATE, USER_DELETE }; struct klist_user_context { - enum klist_user_command cmd; + enum klist_user_command cmd; }; typedef struct klist_user_context klist_user_context; klist_user_context *klist_user_context_init(klist *list); void klist_user_context_deinit(klist_user_context *ctx); - enum klist_list_command { - LIST_ADD, - LIST_EDIT, - LIST_GET, - LIST_DELETE, + LIST_ADD, + LIST_EDIT, + LIST_GET, + LIST_DELETE, }; struct klist_list_context { - enum klist_list_command cmd; - char *name; - char *desc; - char **stages; - size_t stages_len; - char *preset; + enum klist_list_command cmd; + char *name; + char *desc; + char **stages; + size_t stages_len; + char *preset; }; typedef struct klist_list_context klist_list_context; klist_list_context *klist_list_context_init(klist *list); -klist_list_context *klist_list_context_get_by_id(klist_list_context *ctx, u_int id); +klist_list_context *klist_list_context_get_by_id(klist_list_context *ctx, + u_int id); void klist_list_context_deinit(klist_list_context *ctx); - enum klist_task_command { - TASK_ADD, - TASK_EDIT, - TASK_GET, - TASK_DELETE, + TASK_ADD, + TASK_EDIT, + TASK_GET, + TASK_DELETE, }; struct klist_task_context { - enum klist_task_command cmd; - char *list; - char *name; - char *desc; - char *stage; + enum klist_task_command cmd; + char *list; + char *name; + char *desc; + char *stage; }; typedef struct klist_task_context klist_task_context; klist_task_context *klist_task_context_init(klist *list); void klist_task_context_deinit(klist_task_context *ctx); - - /* * sql preparations */ void klist_sql_prepare(klist *, char *); - - /* * assuring things */ diff --git a/src/main/main.c b/src/main/main.c index af33bee..84bc11b 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -1,7 +1,7 @@ #include #include -#include #include +#include #include "models.h" #include "util.h" @@ -10,312 +10,346 @@ void print_help(char **argv); void setup(klist *ctx, int argc, char **argv); int main(int argc, char **argv) { - klist *ctx = klist_init("test.db"); + klist *ctx = klist_init("test.db"); - if (argc == 1) { - print_help(argv); - ctx->error = 1; - } + if (argc == 1) { + print_help(argv); + ctx->error = 1; + } - if (!ctx->error) { - setup(ctx, argc, argv); - klist_user *user = klist_user_get_by_local(ctx, getuid()); - klist_list *list = NULL; - int i = 0; - switch (ctx->cmd) { - case USER: - klist_user_context *user_ctx = ctx->cmd_ctx; - switch (user_ctx->cmd) { - case USER_GET: - if (user) { - fprintf( - stderr, - "User: %p\nID: %lu\n", user->name, user->id - ); - size_t lists_len, i = 0; - klist_list **lists = klist_list_get_all_by_user(ctx, user->id, &lists_len); - fprintf(stderr, "Lists: %lu\n", lists_len); - for (; i < lists_len; i++) klist_list_deinit(lists[i]); - } else fprintf(stderr, "No user for '%s' found.\n", getlogin()); - break; - case USER_CREATE: - fprintf( - stderr, - (klist_assure_user(ctx, getuid(), getlogin())) - ? "User created.\n" - : "User already exists.\n" - ); - break; - case USER_DELETE: - if (user) { - klist_user_delete(ctx, user); - fprintf(stderr, "User deleted.\n"); - } else fprintf(stderr, "User not found, no changes done.\n"); - break; - } - klist_user_context_deinit(user_ctx); - break; - case LIST: - klist_list_context *list_ctx = ctx->cmd_ctx; - if (!list_ctx->name) { fprintf(stderr, "Missing name.\n"); break; } - switch (list_ctx->cmd) { - case LIST_ADD: - if (!list_ctx->stages_len) { fprintf(stderr, "Missing stages.\n"); break; } - list = klist_list_init(); - list->name = (unsigned char*)list_ctx->name; - list->desc = (unsigned char*)list_ctx->desc; - list->is_preset = false; - klist_list_save(ctx, list); - i = 0; - for (; i < list_ctx->stages_len; i++) { - klist_stage *stage = klist_stage_init(); - stage->name = (unsigned char*)list_ctx->stages[i]; - stage->list_id = list->id; - klist_stage_save(ctx, stage); - klist_stage_deinit(stage); - } - break; - case LIST_EDIT: - fprintf(stderr, "Not implemented\n"); - break; - case LIST_GET: - klist_assure_user(ctx, getuid(), getlogin()); - user = klist_user_get_by_local(ctx, getuid()); - list = klist_list_get_by_user_and_name(ctx, user->id, list_ctx->name); - if (list) { - size_t tasks_len = 0; - klist_task **tasks = klist_task_get_for_list(ctx, list->id, &tasks_len); - fprintf(stderr, "Name: %s\nDescription: %s\nTasks: %ld\n", (char *)list->name, (char *)list->desc, tasks_len); - int i = 0; - for(; i < tasks_len; i++) klist_task_deinit(tasks[i]); - free(tasks); - } else - fprintf(stderr, "List '%s' not found.\n", list_ctx->name); - break; - case LIST_DELETE: - list = klist_list_get_by_user_and_name(ctx, user->id, list_ctx->name); - if (list) { - size_t tasks_len = 0; - klist_task **tasks = klist_task_get_for_list(ctx, list->id, &tasks_len); - int i = 0; - for (; i < tasks_len; i++) { - klist_task_delete(ctx, tasks[i]); - klist_task_deinit(tasks[i]); - } - free(tasks); - } - } - if (list_ctx) klist_list_context_deinit(list_ctx); - break; - case TASK: - klist_task_context *task_ctx = ctx->cmd_ctx; - switch (((klist_task_context *)ctx->cmd_ctx)->cmd) { - case TASK_ADD: // basically the same things happen and edit can create if nescessary - case TASK_EDIT: - klist_assure_user(ctx, getuid(), getlogin()); - user = klist_user_get_by_local(ctx, getuid()); - list = klist_list_get_by_user_and_name(ctx, user->id, task_ctx->list); - if (list) { - size_t stages_len = 0; - klist_stage **stages = klist_stage_get_all_for_list(ctx, list->id, &stages_len); - if (!task_ctx->stage) { - fprintf(stderr, "Stage missing/wrong, please pass one of: "); - i = 0; - for (; i < stages_len; i++) - fprintf(stderr, "%s ", (char *)stages[i]->name); - fprintf(stderr, "\n"); - break; - } - i = 0; - ssize_t stage_id = -1; - for (; i < stages_len; i++) - if (strcmp((char *)stages[i]->name, (char *)task_ctx->stage) == 0) - stage_id = stages[i]->id; - - if (stage_id == -1) { - fprintf(stderr, "Stage %s not found. Use one of: ", (char *)task_ctx->stage); - i = 0; - for (; i < stages_len; i++) - fprintf(stderr, "%s ", (char *)stages[i]->name); - fprintf(stderr, "\n"); - } - i = 0; - for (; i < stages_len; i++) - klist_stage_deinit(stages[i]); - free(stages); - if (ctx->error) break; - - klist_task *task = klist_task_get_for_list_by_name(ctx, list->id, task_ctx->name); - if (!task) task = klist_task_init(); - task->name = (unsigned char*)task_ctx->name; - if (task_ctx->desc) task->desc = (unsigned char*)task_ctx->desc; - task->stage_id = stage_id; - klist_task_save(ctx, task); - klist_task_deinit(task); - } else fprintf(stderr, "List not found.\n"); - break; - case TASK_GET: - klist_assure_user(ctx, getuid(), getlogin()); - user = klist_user_get_by_local(ctx, getuid()); - list = klist_list_get_by_user_and_name(ctx, user->id, task_ctx->list); - if (list) { - if (task_ctx->name) { - klist_task *task = klist_task_get_for_list_by_name(ctx, list->id, task_ctx->name); - if (task) { - fprintf(stderr, "Name: %s\n", (char *)task->name); - fprintf(stderr, "Description: %s\n", (char *)task->desc); - klist_stage *stage = klist_stage_get_by_id(ctx, task->stage_id); - fprintf(stderr, "Stage: %s\n", (char*)stage->name); - klist_stage_deinit(stage); - klist_task_deinit(task); - } else fprintf(stderr, "Task not found.\n"); - } else { - size_t tasks_len = 0; - klist_task **tasks = klist_task_get_for_list(ctx, list->id, &tasks_len); - i = 0; - for (; i < tasks_len; i++) { - fprintf(stderr, "Name: %s\n", (char *)tasks[i]->name); - fprintf(stderr, "Description: %s\n", (char *)tasks[i]->desc); - klist_stage *stage = klist_stage_get_by_id(ctx, tasks[i]->stage_id); - fprintf(stderr, "Stage: %s\n", (char*)stage->name); - klist_stage_deinit(stage); - klist_task_deinit(tasks[i]); - if ((i+1) < tasks_len) fprintf(stderr, "\n"); - } - } - } else fprintf(stderr, "List not found"); - case TASK_DELETE: - klist_assure_user(ctx, getuid(), getlogin()); - user = klist_user_get_by_local(ctx, getuid()); - list = klist_list_get_by_user_and_name(ctx, user->id, task_ctx->list); - if (list) { - if (task_ctx) { - klist_task *task = klist_task_get_for_list_by_name(ctx, list->id, task_ctx->name); - if (task) { - fprintf(stderr, "Deleting task '%s'.\n", (char *)task->name); - klist_task_delete(ctx, task); - klist_task_deinit(task); - } else fprintf(stderr, "Task not found.\n"); - } else fprintf(stderr, "Task not found, only deletion by name is currently supoprted.\n"); - - } - fprintf(stderr, "Not implemented\n"); - } - klist_task_context_deinit(task_ctx); - default: ; + if (!ctx->error) { + setup(ctx, argc, argv); + klist_user *user = klist_user_get_by_local(ctx, getuid()); + klist_list *list = NULL; + int i = 0; + switch (ctx->cmd) { + case USER: + klist_user_context *user_ctx = ctx->cmd_ctx; + switch (user_ctx->cmd) { + case USER_GET: + if (user) { + fprintf(stderr, "User: %p\nID: %lu\n", user->name, user->id); + size_t lists_len, i = 0; + klist_list **lists = + klist_list_get_all_by_user(ctx, user->id, &lists_len); + fprintf(stderr, "Lists: %lu\n", lists_len); + for (; i < lists_len; i++) + klist_list_deinit(lists[i]); + } else + fprintf(stderr, "No user for '%s' found.\n", getlogin()); + break; + case USER_CREATE: + fprintf(stderr, (klist_assure_user(ctx, getuid(), getlogin())) + ? "User created.\n" + : "User already exists.\n"); + break; + case USER_DELETE: + if (user) { + klist_user_delete(ctx, user); + fprintf(stderr, "User deleted.\n"); + } else + fprintf(stderr, "User not found, no changes done.\n"); + break; + } + klist_user_context_deinit(user_ctx); + break; + case LIST: + klist_list_context *list_ctx = ctx->cmd_ctx; + if (!list_ctx->name) { + fprintf(stderr, "Missing name.\n"); + break; + } + switch (list_ctx->cmd) { + case LIST_ADD: + if (!list_ctx->stages_len) { + fprintf(stderr, "Missing stages.\n"); + break; } - if (list) klist_list_deinit(list); - if (user) klist_user_deinit(user); - } + list = klist_list_init(); + list->name = (unsigned char *)list_ctx->name; + list->desc = (unsigned char *)list_ctx->desc; + list->is_preset = false; + klist_list_save(ctx, list); + i = 0; + for (; i < list_ctx->stages_len; i++) { + klist_stage *stage = klist_stage_init(); + stage->name = (unsigned char *)list_ctx->stages[i]; + stage->list_id = list->id; + klist_stage_save(ctx, stage); + klist_stage_deinit(stage); + } + break; + case LIST_EDIT: + fprintf(stderr, "Not implemented\n"); + break; + case LIST_GET: + klist_assure_user(ctx, getuid(), getlogin()); + user = klist_user_get_by_local(ctx, getuid()); + list = klist_list_get_by_user_and_name(ctx, user->id, list_ctx->name); + if (list) { + size_t tasks_len = 0; + klist_task **tasks = + klist_task_get_for_list(ctx, list->id, &tasks_len); + fprintf(stderr, "Name: %s\nDescription: %s\nTasks: %ld\n", + (char *)list->name, (char *)list->desc, tasks_len); + int i = 0; + for (; i < tasks_len; i++) + klist_task_deinit(tasks[i]); + free(tasks); + } else + fprintf(stderr, "List '%s' not found.\n", list_ctx->name); + break; + case LIST_DELETE: + list = klist_list_get_by_user_and_name(ctx, user->id, list_ctx->name); + if (list) { + size_t tasks_len = 0; + klist_task **tasks = + klist_task_get_for_list(ctx, list->id, &tasks_len); + int i = 0; + for (; i < tasks_len; i++) { + klist_task_delete(ctx, tasks[i]); + klist_task_deinit(tasks[i]); + } + free(tasks); + } + } + if (list_ctx) + klist_list_context_deinit(list_ctx); + break; + case TASK: + klist_task_context *task_ctx = ctx->cmd_ctx; + switch (((klist_task_context *)ctx->cmd_ctx)->cmd) { + case TASK_ADD: // basically the same things happen and edit can create if + // nescessary + case TASK_EDIT: + klist_assure_user(ctx, getuid(), getlogin()); + user = klist_user_get_by_local(ctx, getuid()); + list = klist_list_get_by_user_and_name(ctx, user->id, task_ctx->list); + if (list) { + size_t stages_len = 0; + klist_stage **stages = + klist_stage_get_all_for_list(ctx, list->id, &stages_len); + if (!task_ctx->stage) { + fprintf(stderr, "Stage missing/wrong, please pass one of: "); + i = 0; + for (; i < stages_len; i++) + fprintf(stderr, "%s ", (char *)stages[i]->name); + fprintf(stderr, "\n"); + break; + } + i = 0; + ssize_t stage_id = -1; + for (; i < stages_len; i++) + if (strcmp((char *)stages[i]->name, (char *)task_ctx->stage) == 0) + stage_id = stages[i]->id; - const int error = ctx->error; - klist_deinit(ctx); - return error; + if (stage_id == -1) { + fprintf(stderr, "Stage %s not found. Use one of: ", + (char *)task_ctx->stage); + i = 0; + for (; i < stages_len; i++) + fprintf(stderr, "%s ", (char *)stages[i]->name); + fprintf(stderr, "\n"); + } + i = 0; + for (; i < stages_len; i++) + klist_stage_deinit(stages[i]); + free(stages); + if (ctx->error) + break; + + klist_task *task = + klist_task_get_for_list_by_name(ctx, list->id, task_ctx->name); + if (!task) + task = klist_task_init(); + task->name = (unsigned char *)task_ctx->name; + if (task_ctx->desc) + task->desc = (unsigned char *)task_ctx->desc; + task->stage_id = stage_id; + klist_task_save(ctx, task); + klist_task_deinit(task); + } else + fprintf(stderr, "List not found.\n"); + break; + case TASK_GET: + klist_assure_user(ctx, getuid(), getlogin()); + user = klist_user_get_by_local(ctx, getuid()); + list = klist_list_get_by_user_and_name(ctx, user->id, task_ctx->list); + if (list) { + if (task_ctx->name) { + klist_task *task = + klist_task_get_for_list_by_name(ctx, list->id, task_ctx->name); + if (task) { + fprintf(stderr, "Name: %s\n", (char *)task->name); + fprintf(stderr, "Description: %s\n", (char *)task->desc); + klist_stage *stage = klist_stage_get_by_id(ctx, task->stage_id); + fprintf(stderr, "Stage: %s\n", (char *)stage->name); + klist_stage_deinit(stage); + klist_task_deinit(task); + } else + fprintf(stderr, "Task not found.\n"); + } else { + size_t tasks_len = 0; + klist_task **tasks = + klist_task_get_for_list(ctx, list->id, &tasks_len); + i = 0; + for (; i < tasks_len; i++) { + fprintf(stderr, "Name: %s\n", (char *)tasks[i]->name); + fprintf(stderr, "Description: %s\n", (char *)tasks[i]->desc); + klist_stage *stage = + klist_stage_get_by_id(ctx, tasks[i]->stage_id); + fprintf(stderr, "Stage: %s\n", (char *)stage->name); + klist_stage_deinit(stage); + klist_task_deinit(tasks[i]); + if ((i + 1) < tasks_len) + fprintf(stderr, "\n"); + } + } + } else + fprintf(stderr, "List not found"); + case TASK_DELETE: + klist_assure_user(ctx, getuid(), getlogin()); + user = klist_user_get_by_local(ctx, getuid()); + list = klist_list_get_by_user_and_name(ctx, user->id, task_ctx->list); + if (list) { + if (task_ctx) { + klist_task *task = + klist_task_get_for_list_by_name(ctx, list->id, task_ctx->name); + if (task) { + fprintf(stderr, "Deleting task '%s'.\n", (char *)task->name); + klist_task_delete(ctx, task); + klist_task_deinit(task); + } else + fprintf(stderr, "Task not found.\n"); + } else + fprintf(stderr, "Task not found, only deletion by name is " + "currently supoprted.\n"); + } + fprintf(stderr, "Not implemented\n"); + } + klist_task_context_deinit(task_ctx); + default:; + } + if (list) + klist_list_deinit(list); + if (user) + klist_user_deinit(user); + } + + const int error = ctx->error; + klist_deinit(ctx); + return error; } void print_help(char **argv) { - fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, "Usage: %s \n", argv[0]); } void setup(klist *ctx, int argc, char **argv) { - if (strcmp(argv[1], "user") == 0) - ctx->cmd = USER; - else if (strcmp(argv[1], "list") == 0) - ctx->cmd = LIST; - else if (strcmp(argv[1], "task") == 0) - ctx->cmd = TASK; - else print_help(argv); + if (strcmp(argv[1], "user") == 0) + ctx->cmd = USER; + else if (strcmp(argv[1], "list") == 0) + ctx->cmd = LIST; + else if (strcmp(argv[1], "task") == 0) + ctx->cmd = TASK; + else + print_help(argv); - int opt; - switch (ctx->cmd) { - case USER: - optind = 2; - klist_user_context *user_ctx = klist_user_context_init(ctx); - while ((opt = getopt(argc, argv, "cdg")) != -1) - switch (opt) { - case 'c': - user_ctx->cmd = USER_CREATE; - break; - case 'd': - user_ctx->cmd = USER_DELETE; - break; - case 'g': - user_ctx->cmd = USER_GET; - break; - default: - print_help(argv); - } - ctx->cmd_ctx = user_ctx; - break; - case LIST: - if (argc < 3) { - fprintf(stderr, "Prints all lists.\n"); - break; - } - klist_list_context *list_ctx = malloc(sizeof(struct klist_list_context)); - - optind = 3; - while ((opt = getopt(argc, argv, "adep:s:")) != -1) - switch (opt) { - case 'a': - list_ctx->cmd = LIST_ADD; - break; - case 'e': - list_ctx->cmd = LIST_EDIT; - break; - case 'd': - list_ctx->cmd = LIST_DELETE; - break; - case 'p': - list_ctx->preset = malloc((strlen(optarg) + 1) * sizeof(char)); - strcpy(list_ctx->preset, optarg); - break; - default: - print_help(argv); - fprintf(stderr, "" - "list options:\n" - "-a\t\tadd a list\n" - "-e\t\tedit a list\n" - "-d\t\tdelete a list\n" - "-p \tdefine as preset or use existing one with name " - "Not providing a parameter prints all lists and existing presets."); - } - ctx->cmd_ctx = list_ctx; - break; - case TASK: - if (argc < 3) { - fprintf(stderr, "Prints all lists.\n"); - break; - } - klist_task_context *task_ctx = malloc(sizeof(struct klist_task_context)); - - optind = 3; - - while ((opt = getopt(argc, argv, "aeds:")) != -1) - switch (opt) { - case 'a': - task_ctx->cmd = TASK_ADD; - break; - case 'e': - task_ctx->cmd = TASK_EDIT; - break; - case 'd': - task_ctx->cmd = TASK_DELETE; - break; - default: - print_help(argv); - fprintf(stderr, "" - "task options:" - "-a\tadd a task" - "-e\tedit a task" - "-d\tdelete a task" - "Not providing a parameter prints all tasks of a list."); - } - - ctx->cmd_ctx = task_ctx; - break; - default: - fprintf(stderr, "How did we land here?! Pls report argv[1] = %s\n", argv[1]); - print_help(argv); + int opt; + switch (ctx->cmd) { + case USER: + optind = 2; + klist_user_context *user_ctx = klist_user_context_init(ctx); + while ((opt = getopt(argc, argv, "cdg")) != -1) + switch (opt) { + case 'c': + user_ctx->cmd = USER_CREATE; + break; + case 'd': + user_ctx->cmd = USER_DELETE; + break; + case 'g': + user_ctx->cmd = USER_GET; + break; + default: + print_help(argv); + } + ctx->cmd_ctx = user_ctx; + break; + case LIST: + if (argc < 3) { + fprintf(stderr, "Prints all lists.\n"); + break; } + klist_list_context *list_ctx = malloc(sizeof(struct klist_list_context)); + + optind = 3; + while ((opt = getopt(argc, argv, "adep:s:")) != -1) + switch (opt) { + case 'a': + list_ctx->cmd = LIST_ADD; + break; + case 'e': + list_ctx->cmd = LIST_EDIT; + break; + case 'd': + list_ctx->cmd = LIST_DELETE; + break; + case 'p': + list_ctx->preset = malloc((strlen(optarg) + 1) * sizeof(char)); + strcpy(list_ctx->preset, optarg); + break; + default: + print_help(argv); + fprintf( + stderr, + "" + "list options:\n" + "-a\t\tadd a list\n" + "-e\t\tedit a list\n" + "-d\t\tdelete a list\n" + "-p \tdefine as preset or use existing one with name " + "" + "Not providing a parameter prints all lists and existing presets."); + } + ctx->cmd_ctx = list_ctx; + break; + case TASK: + if (argc < 3) { + fprintf(stderr, "Prints all lists.\n"); + break; + } + klist_task_context *task_ctx = malloc(sizeof(struct klist_task_context)); + + optind = 3; + + while ((opt = getopt(argc, argv, "aeds:")) != -1) + switch (opt) { + case 'a': + task_ctx->cmd = TASK_ADD; + break; + case 'e': + task_ctx->cmd = TASK_EDIT; + break; + case 'd': + task_ctx->cmd = TASK_DELETE; + break; + default: + print_help(argv); + fprintf(stderr, + "" + "task options:" + "-a\tadd a task" + "-e\tedit a task" + "-d\tdelete a task" + "Not providing a parameter prints all tasks of a list."); + } + + ctx->cmd_ctx = task_ctx; + break; + default: + fprintf(stderr, "How did we land here?! Pls report argv[1] = %s\n", + argv[1]); + print_help(argv); + } } diff --git a/src/main/models.c b/src/main/models.c index 4625b1d..8b17bc9 100644 --- a/src/main/models.c +++ b/src/main/models.c @@ -7,312 +7,332 @@ #include "sql.h" klist_user *klist_user_init() { - klist_user *user = malloc(sizeof(klist_user)); - user->id = -1; - user->name = NULL; - user->local_id = -1; - return user; + klist_user *user = malloc(sizeof(klist_user)); + user->id = -1; + user->name = NULL; + user->local_id = -1; + return user; } klist_user *klist_user_init_from_sql(sqlite3_stmt *stmt) { - klist_user *user = klist_user_init(); - size_t bytes; - user->id = sqlite3_column_int(stmt, 0); - if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { - user->name = malloc(bytes); - memcpy(user->name, sqlite3_column_text(stmt, 1), bytes); - } - return user; + klist_user *user = klist_user_init(); + size_t bytes; + user->id = sqlite3_column_int(stmt, 0); + if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { + user->name = malloc(bytes); + memcpy(user->name, sqlite3_column_text(stmt, 1), bytes); + } + return user; } klist_user *klist_user_get_by_id(klist *ctx, u_int id) { - sqlite3_stmt *stmt = ctx->stmts[GET_USER]; - sqlite3_bind_int(stmt, 1, id); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_user_init_from_sql(stmt); - } - return NULL; + sqlite3_stmt *stmt = ctx->stmts[GET_USER]; + sqlite3_bind_int(stmt, 1, id); + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_user_init_from_sql(stmt); + } + return NULL; } klist_user *klist_user_get_by_local(klist *ctx, u_int local_id) { - sqlite3_stmt *stmt = ctx->stmts[GET_USER_BY_LOCAL]; - sqlite3_bind_int(stmt, 1, local_id); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_user_init_from_sql(stmt); - } - return NULL; + sqlite3_stmt *stmt = ctx->stmts[GET_USER_BY_LOCAL]; + sqlite3_bind_int(stmt, 1, local_id); + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_user_init_from_sql(stmt); + } + return NULL; } void klist_user_save(klist *ctx, klist_user *user) { - sqlite3_stmt *stmt = ctx->stmts[ADD_USER]; - int result = 0; - sqlite3_bind_text(stmt, 1, (char*)user->name, -1, SQLITE_STATIC); - if ((result = sqlite3_step(stmt)) == SQLITE_ROW) - user->id = sqlite3_column_int(stmt, 1); - else - fprintf(stderr, "failed to save user: %s - %d\n", sqlite3_errmsg(ctx->db), result); - sqlite3_clear_bindings(stmt); + sqlite3_stmt *stmt = ctx->stmts[ADD_USER]; + int result = 0; + sqlite3_bind_text(stmt, 1, (char *)user->name, -1, SQLITE_STATIC); + if ((result = sqlite3_step(stmt)) == SQLITE_ROW) + user->id = sqlite3_column_int(stmt, 1); + else + fprintf(stderr, "failed to save user: %s - %d\n", sqlite3_errmsg(ctx->db), + result); + sqlite3_clear_bindings(stmt); - if (user->local_id != -1) { - sqlite3_stmt *stmt = ctx->stmts[ADD_LOGIN]; - int result = 0; - sqlite3_bind_int(stmt, 1, user->id); - sqlite3_bind_int(stmt, 2, user->local_id); - if ((result = sqlite3_step(stmt)) != SQLITE_ROW) - fprintf(stderr, "failed to save logins for user: %s - %d\n", sqlite3_errmsg(ctx->db), result); - sqlite3_clear_bindings(stmt); - } + if (user->local_id != -1) { + sqlite3_stmt *stmt = ctx->stmts[ADD_LOGIN]; + int result = 0; + sqlite3_bind_int(stmt, 1, user->id); + sqlite3_bind_int(stmt, 2, user->local_id); + if ((result = sqlite3_step(stmt)) != SQLITE_ROW) + fprintf(stderr, "failed to save logins for user: %s - %d\n", + sqlite3_errmsg(ctx->db), result); + sqlite3_clear_bindings(stmt); + } } void klist_user_delete(klist *ctx, klist_user *user) { - sqlite3_stmt *stmt = ctx->stmts[DEL_USER]; - sqlite3_bind_int(stmt, 1, (int)user->id); - if (sqlite3_step(stmt) == SQLITE_ROW) - sqlite3_clear_bindings(stmt); + sqlite3_stmt *stmt = ctx->stmts[DEL_USER]; + sqlite3_bind_int(stmt, 1, (int)user->id); + if (sqlite3_step(stmt) == SQLITE_ROW) + sqlite3_clear_bindings(stmt); } void klist_user_deinit(klist_user *user) { - free(user->name); - free(user); + free(user->name); + free(user); } - klist_stage *klist_stage_init() { - klist_stage *stage = malloc(sizeof(klist_stage)); - stage->id = -1; - stage->name = NULL; - stage->desc = NULL; - stage->list_id = -1; - return stage; + klist_stage *stage = malloc(sizeof(klist_stage)); + stage->id = -1; + stage->name = NULL; + stage->desc = NULL; + stage->list_id = -1; + return stage; } klist_stage *klist_stage_init_from_sql(sqlite3_stmt *stmt) { - klist_stage *stage = klist_stage_init(); - size_t bytes; - stage->id = sqlite3_column_int(stmt, 0); - if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { - stage->name = malloc(bytes); - memcpy(stage->name, sqlite3_column_text(stmt, 1), bytes); - } - if ((bytes = sqlite3_column_bytes(stmt, 2)) > 0) { - stage->desc = malloc(bytes); - memcpy(stage->desc, sqlite3_column_text(stmt, 2), bytes); - } - return stage; + klist_stage *stage = klist_stage_init(); + size_t bytes; + stage->id = sqlite3_column_int(stmt, 0); + if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { + stage->name = malloc(bytes); + memcpy(stage->name, sqlite3_column_text(stmt, 1), bytes); + } + if ((bytes = sqlite3_column_bytes(stmt, 2)) > 0) { + stage->desc = malloc(bytes); + memcpy(stage->desc, sqlite3_column_text(stmt, 2), bytes); + } + return stage; } klist_stage *klist_stage_get_by_id(klist *ctx, u_int id) { - sqlite3_stmt *stmt = ctx->stmts[GET_STAGE]; - sqlite3_bind_int(stmt, 1, id); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_stage_init_from_sql(stmt); - } - return NULL; + sqlite3_stmt *stmt = ctx->stmts[GET_STAGE]; + sqlite3_bind_int(stmt, 1, id); + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_stage_init_from_sql(stmt); + } + return NULL; } -klist_stage **klist_stage_get_all_for_list(klist *ctx, u_int id, size_t *count) { - sqlite3_stmt *stmt = ctx->stmts[GET_STAGES_FOR_LIST]; - sqlite3_bind_int(stmt, 1, id); - klist_stage **stages = NULL; - size_t stages_len = 0; - while (sqlite3_step(stmt) == SQLITE_ROW) { - stages_len++; - klist_stage **_stages = realloc(stages, stages_len * sizeof(klist_stage *)); - if (_stages) { - stages = _stages; - stages[stages_len - 1] = klist_stage_init(stmt); - } +klist_stage **klist_stage_get_all_for_list(klist *ctx, u_int id, + size_t *count) { + sqlite3_stmt *stmt = ctx->stmts[GET_STAGES_FOR_LIST]; + sqlite3_bind_int(stmt, 1, id); + klist_stage **stages = NULL; + size_t stages_len = 0; + while (sqlite3_step(stmt) == SQLITE_ROW) { + stages_len++; + klist_stage **_stages = realloc(stages, stages_len * sizeof(klist_stage *)); + if (_stages) { + stages = _stages; + stages[stages_len - 1] = klist_stage_init(stmt); } - if (count != NULL) *count = stages_len; - return stages; + } + if (count != NULL) + *count = stages_len; + return stages; } void klist_stage_save(klist *ctx, klist_stage *stage) { - sqlite3_stmt *stmt = ctx->stmts[ADD_STAGE]; - int result = 0; - sqlite3_bind_text(stmt, 1, (char*)stage->name, -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 2, (char*)stage->name, -1, SQLITE_STATIC); - if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { - stage->id = sqlite3_column_int(stmt, 1); - sqlite3_clear_bindings(stmt); - } else fprintf(stderr, "failed to save stage: %s - %d\n", sqlite3_errmsg(ctx->db), result); + sqlite3_stmt *stmt = ctx->stmts[ADD_STAGE]; + int result = 0; + sqlite3_bind_text(stmt, 1, (char *)stage->name, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, (char *)stage->name, -1, SQLITE_STATIC); + if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { + stage->id = sqlite3_column_int(stmt, 1); + sqlite3_clear_bindings(stmt); + } else + fprintf(stderr, "failed to save stage: %s - %d\n", sqlite3_errmsg(ctx->db), + result); } void klist_stage_deinit(klist_stage *stage) { - if (stage->name) free(stage->name); - if (stage->desc) free(stage->desc); - free(stage); + if (stage->name) + free(stage->name); + if (stage->desc) + free(stage->desc); + free(stage); } - klist_list *klist_list_init() { - klist_list *list = malloc(sizeof(klist_list)); - list->id = -1; - list->name = NULL; - list->desc = NULL; - list->is_preset = false; - return list; + klist_list *list = malloc(sizeof(klist_list)); + list->id = -1; + list->name = NULL; + list->desc = NULL; + list->is_preset = false; + return list; } klist_list *klist_list_init_from_sql(sqlite3_stmt *stmt) { - klist_list *list = klist_list_init(); - size_t bytes; - list->id = sqlite3_column_int(stmt, 0); - if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { - list->name = malloc(bytes); - memcpy(list->name, sqlite3_column_text(stmt, 1), bytes); - } - if ((bytes = sqlite3_column_bytes(stmt, 2)) > 0) { - list->desc = malloc(bytes); - memcpy(list->desc, sqlite3_column_text(stmt, 2), bytes); - } - list->is_preset = sqlite3_column_int(stmt, 3) ? true : false; - return list; + klist_list *list = klist_list_init(); + size_t bytes; + list->id = sqlite3_column_int(stmt, 0); + if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { + list->name = malloc(bytes); + memcpy(list->name, sqlite3_column_text(stmt, 1), bytes); + } + if ((bytes = sqlite3_column_bytes(stmt, 2)) > 0) { + list->desc = malloc(bytes); + memcpy(list->desc, sqlite3_column_text(stmt, 2), bytes); + } + list->is_preset = sqlite3_column_int(stmt, 3) ? true : false; + return list; } klist_list *klist_list_get_by_id(klist *ctx, u_int id) { - sqlite3_stmt *stmt = ctx->stmts[GET_LIST]; - sqlite3_bind_int(stmt, 1, id); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_list_init_from_sql(stmt); - } - return NULL; + sqlite3_stmt *stmt = ctx->stmts[GET_LIST]; + sqlite3_bind_int(stmt, 1, id); + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_list_init_from_sql(stmt); + } + return NULL; } -klist_list **klist_list_get_all_by_user(klist *ctx, u_int user_id, size_t *count) { - sqlite3_stmt *stmt = ctx->stmts[GET_LISTS_BY_USER]; - sqlite3_bind_int(stmt, 1, user_id); - klist_list **lists = NULL; - size_t lists_len = 0; - while (sqlite3_step(stmt) == SQLITE_ROW) { - lists_len++; - klist_list **_lists = realloc(lists, lists_len * sizeof(klist_list *)); - if (_lists) { - lists = _lists; - lists[lists_len - 1] = klist_list_init(stmt); - } +klist_list **klist_list_get_all_by_user(klist *ctx, u_int user_id, + size_t *count) { + sqlite3_stmt *stmt = ctx->stmts[GET_LISTS_BY_USER]; + sqlite3_bind_int(stmt, 1, user_id); + klist_list **lists = NULL; + size_t lists_len = 0; + while (sqlite3_step(stmt) == SQLITE_ROW) { + lists_len++; + klist_list **_lists = realloc(lists, lists_len * sizeof(klist_list *)); + if (_lists) { + lists = _lists; + lists[lists_len - 1] = klist_list_init(stmt); } - if (count != NULL) *count = lists_len; - return lists; + } + if (count != NULL) + *count = lists_len; + return lists; } -klist_list *klist_list_get_by_user_and_name(klist *ctx, u_int user_id, const char *name) { - sqlite3_stmt *stmt = ctx->stmts[GET_LISTS_BY_USER]; - sqlite3_bind_int(stmt, 1, user_id); - sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC); +klist_list *klist_list_get_by_user_and_name(klist *ctx, u_int user_id, + const char *name) { + sqlite3_stmt *stmt = ctx->stmts[GET_LISTS_BY_USER]; + sqlite3_bind_int(stmt, 1, user_id); + sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_list_init(stmt); - } - return NULL; + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_list_init(stmt); + } + return NULL; } void klist_list_save(klist *ctx, klist_list *list) { - sqlite3_stmt *stmt = ctx->stmts[ADD_LIST]; - int result = 0; - sqlite3_bind_text(stmt, 1, (char*)list->name, -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 2, (char*)list->desc, -1, SQLITE_STATIC); - if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { - list->id = sqlite3_column_int(stmt, 1); - sqlite3_clear_bindings(stmt); - } else fprintf(stderr, "failed to save list: %s - %d\n", sqlite3_errmsg(ctx->db), result); + sqlite3_stmt *stmt = ctx->stmts[ADD_LIST]; + int result = 0; + sqlite3_bind_text(stmt, 1, (char *)list->name, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, (char *)list->desc, -1, SQLITE_STATIC); + if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { + list->id = sqlite3_column_int(stmt, 1); + sqlite3_clear_bindings(stmt); + } else + fprintf(stderr, "failed to save list: %s - %d\n", sqlite3_errmsg(ctx->db), + result); } void klist_list_deinit(klist_list *list) { - if (list->name) free(list->name); - if (list->desc) free(list->desc); - free(list); + if (list->name) + free(list->name); + if (list->desc) + free(list->desc); + free(list); } - klist_task *klist_task_init() { - klist_task *task = malloc(sizeof(klist_task)); - task->id = -1; - task->name = NULL; - task->desc = NULL; - return task; + klist_task *task = malloc(sizeof(klist_task)); + task->id = -1; + task->name = NULL; + task->desc = NULL; + return task; } klist_task *klist_task_init_from_sql(sqlite3_stmt *stmt) { - klist_task *task = klist_task_init(); - size_t bytes; - task->id = sqlite3_column_int(stmt, 0); - if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { - task->name = malloc(bytes); - memcpy(task->name, sqlite3_column_text(stmt, 1), bytes); - } - if ((bytes = sqlite3_column_bytes(stmt, 2)) > 0) { - task->desc = malloc(bytes); - memcpy(task->desc, sqlite3_column_text(stmt, 2), bytes); - } - return task; + klist_task *task = klist_task_init(); + size_t bytes; + task->id = sqlite3_column_int(stmt, 0); + if ((bytes = sqlite3_column_bytes(stmt, 1)) > 0) { + task->name = malloc(bytes); + memcpy(task->name, sqlite3_column_text(stmt, 1), bytes); + } + if ((bytes = sqlite3_column_bytes(stmt, 2)) > 0) { + task->desc = malloc(bytes); + memcpy(task->desc, sqlite3_column_text(stmt, 2), bytes); + } + return task; } klist_task *klist_task_get_by_id(klist *ctx, u_int id) { - sqlite3_stmt *stmt = ctx->stmts[GET_TASK]; - sqlite3_bind_int(stmt, 1, id); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_task_init_from_sql(stmt); - } - return NULL; + sqlite3_stmt *stmt = ctx->stmts[GET_TASK]; + sqlite3_bind_int(stmt, 1, id); + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_task_init_from_sql(stmt); + } + return NULL; } klist_task **klist_task_get_for_list(klist *ctx, u_int list_id, size_t *count) { - sqlite3_stmt *stmt = ctx->stmts[GET_TASKS_FOR_LIST]; - sqlite3_bind_int(stmt, 1, list_id); - klist_task **tasks = NULL; - size_t tasks_len = 0; - while (sqlite3_step(stmt) == SQLITE_ROW) { - tasks_len++; - tasks = realloc(tasks, tasks_len * sizeof(klist_task *)); - tasks[tasks_len - 1] = klist_task_init_from_sql(stmt); - } - sqlite3_clear_bindings(stmt); - *count = tasks_len; - return tasks; + sqlite3_stmt *stmt = ctx->stmts[GET_TASKS_FOR_LIST]; + sqlite3_bind_int(stmt, 1, list_id); + klist_task **tasks = NULL; + size_t tasks_len = 0; + while (sqlite3_step(stmt) == SQLITE_ROW) { + tasks_len++; + tasks = realloc(tasks, tasks_len * sizeof(klist_task *)); + tasks[tasks_len - 1] = klist_task_init_from_sql(stmt); + } + sqlite3_clear_bindings(stmt); + *count = tasks_len; + return tasks; } -klist_task *klist_task_get_for_list_by_name(klist *ctx, u_int list_id, const char *name) { - sqlite3_stmt *stmt = ctx->stmts[GET_TASKS_FOR_LIST_BY_NAME]; - sqlite3_bind_int(stmt, 1, list_id); - sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC); +klist_task *klist_task_get_for_list_by_name(klist *ctx, u_int list_id, + const char *name) { + sqlite3_stmt *stmt = ctx->stmts[GET_TASKS_FOR_LIST_BY_NAME]; + sqlite3_bind_int(stmt, 1, list_id); + sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC); - if (sqlite3_step(stmt) == SQLITE_ROW) { - sqlite3_clear_bindings(stmt); - return klist_task_init(stmt); - } - return NULL; + if (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_clear_bindings(stmt); + return klist_task_init(stmt); + } + return NULL; } void klist_task_save(klist *ctx, klist_task *task) { - sqlite3_stmt *stmt = ctx->stmts[ADD_TASK]; - int result = 0; - sqlite3_bind_text(stmt, 1, (char*)task->name, -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 2, (char*)task->desc, -1, SQLITE_STATIC); - sqlite3_bind_int(stmt, 3, task->stage_id); - if (task->due) sqlite3_bind_int(stmt, 4, task->due); - if (task->target_stage) sqlite3_bind_int(stmt, 5, task->target_stage); - if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { - task->id = sqlite3_column_int(stmt, 1); - sqlite3_clear_bindings(stmt); - } else fprintf(stderr, "failed to save list: %s - %d\n", sqlite3_errmsg(ctx->db), result); + sqlite3_stmt *stmt = ctx->stmts[ADD_TASK]; + int result = 0; + sqlite3_bind_text(stmt, 1, (char *)task->name, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, (char *)task->desc, -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 3, task->stage_id); + if (task->due) + sqlite3_bind_int(stmt, 4, task->due); + if (task->target_stage) + sqlite3_bind_int(stmt, 5, task->target_stage); + if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { + task->id = sqlite3_column_int(stmt, 1); + sqlite3_clear_bindings(stmt); + } else + fprintf(stderr, "failed to save list: %s - %d\n", sqlite3_errmsg(ctx->db), + result); } void klist_task_delete(klist *ctx, klist_task *task) { - sqlite3_stmt *stmt = ctx->stmts[DEL_TASK]; - sqlite3_bind_int(stmt, 1, task->id); - if (sqlite3_step(stmt) == SQLITE_DONE) - sqlite3_clear_bindings(stmt); - else fprintf(stderr, "failed to delete task: %s\n", sqlite3_errmsg(ctx->db)); + sqlite3_stmt *stmt = ctx->stmts[DEL_TASK]; + sqlite3_bind_int(stmt, 1, task->id); + if (sqlite3_step(stmt) == SQLITE_DONE) + sqlite3_clear_bindings(stmt); + else + fprintf(stderr, "failed to delete task: %s\n", sqlite3_errmsg(ctx->db)); } void klist_task_deinit(klist_task *task) { - if (task->name) free(task->name); - if (task->desc) free(task->desc); - free(task); + if (task->name) + free(task->name); + if (task->desc) + free(task->desc); + free(task); } diff --git a/src/main/sql.c b/src/main/sql.c index e50d9ac..2d989ad 100644 --- a/src/main/sql.c +++ b/src/main/sql.c @@ -1,77 +1,114 @@ #include "include/sql.h" - const char *klist_sql_get(const enum KLIST_SQL sql) { - switch (sql) { - case INIT: return - "create table if not exists users (\n" - " id integer primary key,\n" - " name text not null\n" - ");\n" - "create table if not exists user_logins (\n" - " id integer primary key,\n" - " user_id integer not null,\n" - " local_id integer,\n" - " foreign key (user_id) references users(id)" - ");\n" - "create table if not exists user_lists (\n" - " id integer primary key,\n" - " user_id integer not null,\n" - " list_id integer not null,\n" - " foreign key (user_id) references users(id),\n" - " foreign key (list_id) references lists(id)\n" - ");\n" - "create table if not exists lists (\n" - " id integer primary key,\n" - " name text not null,\n" - " desc text,\n" - " is_preset int not null\n" - ");\n" - "create table if not exists task_stages (\n" - " id integer primary key,\n" - " name text not null,\n" - " desc text,\n" - " list_id integer not null,\n" - " foreign key (list_id) references lists(id)\n" - ");\n" - "-- this currently enables moving tasks _between lists_ (planned of course)\n" - "create table if not exists tasks (\n" - " id integer primary key,\n" - " name text not null,\n" - " desc text,\n" - " stage integer not null,\n" - " due date,\n" - " target_stage integer, -- more like target stage\n" - " foreign key (stage) references task_stages(id),\n" - " foreign key (target_stage) references task_stages(id)\n" - ")"; - case ADD_LOGIN: return "insert into user_logins (user_id, local_id) values (?1, ?2) on conflict (id) do update set user_id=excluded.user_id, local_id=excluded.local_id returning id"; - case ADD_USER: return "insert into users (name) values (?1) on conflict (id) do update set name=excluded.name returning id"; - case GET_USER: return "select users.*, user_logins.local_id from users inner join user_logins on user_logins.user_id = users.id where users.id = ?1"; - case GET_USER_BY_LOCAL: return "select * from users inner join user_logins on user_logins.user_id = users.id where user_logins.local_id = ?1"; - case GET_USERS: return "select * from users"; - case MOD_USER_NAME: return "update users set name = ?1 where id = ?2"; - case DEL_USER: return "delete from users where id = ?1"; - case ADD_LIST: return "insert into lists (name, desc, is_preset) values (?1, ?2, ?3)"; - case GET_LIST: return "select * from lists where id = ?1"; - case GET_LISTS: return "select * from lists"; - case GET_LISTS_BY_USER: return "select * from lists inner join user_lists on user_lists.list_id = lists.id where user_lists.user_id = ?1"; - case GET_LISTS_BY_USER_NAME: return "select * from lists inner join user_lists on user_lists.list_id = lists.id where user_lists.user_id = ?1 and lists.name like '?2'"; - case MOD_LIST_NAME: return "update lists set name = ?1 where id = ?2"; - case DEL_LIST: return "delete from lists where id = ?1"; - case ADD_STAGE: return "insert into task_stages (name, desc, list_id) values (?1, ?2, ?3)"; - case GET_STAGE: return "select * from task_stages where id = ?1"; - case GET_STAGES_FOR_LIST: return "select * from task_stages where list_id = ?1"; - case DEL_STAGE: return "delete from task_stages where id = ?1"; - case ADD_TASK: return "insert into tasks (name, desc, stage, due, target_stage) values (?1, ?2, ?3, ?4, ?5);"; - case GET_TASK: return "select * from tasks where id = ?1"; - case GET_TASKS: return "select * from tasks;"; - case GET_TASKS_FOR_LIST: return "select tasks.* from tasks join task_stages on task_stages.id = tasks.stage where task_stages.list_id = ?1"; - case GET_TASKS_FOR_LIST_BY_NAME: return "select tasks.* from tasks join task_stages on task_stages.id = tasks.stage where task_stages.list_id = ?1 and tasks.name like ?2"; - case MOD_TASK_NAME: return "update tasks set name = ?1 where id = ?2"; - case MOD_TASK_DESCRIPTION: return "update tasks set desc = ?1 where id = ?2"; - case DEL_TASK: return "delete from tasks where id = ?1"; - case _KLIST_SQL_COUNT: return ""; - } + switch (sql) { + case INIT: + return "create table if not exists users (\n" + " id integer primary key,\n" + " name text not null\n" + ");\n" + "create table if not exists user_logins (\n" + " id integer primary key,\n" + " user_id integer not null,\n" + " local_id integer,\n" + " foreign key (user_id) references users(id)" + ");\n" + "create table if not exists user_lists (\n" + " id integer primary key,\n" + " user_id integer not null,\n" + " list_id integer not null,\n" + " foreign key (user_id) references users(id),\n" + " foreign key (list_id) references lists(id)\n" + ");\n" + "create table if not exists lists (\n" + " id integer primary key,\n" + " name text not null,\n" + " desc text,\n" + " is_preset int not null\n" + ");\n" + "create table if not exists task_stages (\n" + " id integer primary key,\n" + " name text not null,\n" + " desc text,\n" + " list_id integer not null,\n" + " foreign key (list_id) references lists(id)\n" + ");\n" + "-- this currently enables moving tasks _between lists_ (planned of " + "course)\n" + "create table if not exists tasks (\n" + " id integer primary key,\n" + " name text not null,\n" + " desc text,\n" + " stage integer not null,\n" + " due date,\n" + " target_stage integer, -- more like target stage\n" + " foreign key (stage) references task_stages(id),\n" + " foreign key (target_stage) references task_stages(id)\n" + ")"; + case ADD_LOGIN: + return "insert into user_logins (user_id, local_id) values (?1, ?2) on " + "conflict (id) do update set user_id=excluded.user_id, " + "local_id=excluded.local_id returning id"; + case ADD_USER: + return "insert into users (name) values (?1) on conflict (id) do update " + "set name=excluded.name returning id"; + case GET_USER: + return "select users.*, user_logins.local_id from users inner join " + "user_logins on user_logins.user_id = users.id where users.id = ?1"; + case GET_USER_BY_LOCAL: + return "select * from users inner join user_logins on user_logins.user_id " + "= users.id where user_logins.local_id = ?1"; + case GET_USERS: + return "select * from users"; + case MOD_USER_NAME: + return "update users set name = ?1 where id = ?2"; + case DEL_USER: + return "delete from users where id = ?1"; + case ADD_LIST: + return "insert into lists (name, desc, is_preset) values (?1, ?2, ?3)"; + case GET_LIST: + return "select * from lists where id = ?1"; + case GET_LISTS: + return "select * from lists"; + case GET_LISTS_BY_USER: + return "select * from lists inner join user_lists on user_lists.list_id = " + "lists.id where user_lists.user_id = ?1"; + case GET_LISTS_BY_USER_NAME: + return "select * from lists inner join user_lists on user_lists.list_id = " + "lists.id where user_lists.user_id = ?1 and lists.name like '?2'"; + case MOD_LIST_NAME: + return "update lists set name = ?1 where id = ?2"; + case DEL_LIST: + return "delete from lists where id = ?1"; + case ADD_STAGE: + return "insert into task_stages (name, desc, list_id) values (?1, ?2, ?3)"; + case GET_STAGE: + return "select * from task_stages where id = ?1"; + case GET_STAGES_FOR_LIST: + return "select * from task_stages where list_id = ?1"; + case DEL_STAGE: + return "delete from task_stages where id = ?1"; + case ADD_TASK: + return "insert into tasks (name, desc, stage, due, target_stage) values " + "(?1, ?2, ?3, ?4, ?5);"; + case GET_TASK: + return "select * from tasks where id = ?1"; + case GET_TASKS: + return "select * from tasks;"; + case GET_TASKS_FOR_LIST: + return "select tasks.* from tasks join task_stages on task_stages.id = " + "tasks.stage where task_stages.list_id = ?1"; + case GET_TASKS_FOR_LIST_BY_NAME: + return "select tasks.* from tasks join task_stages on task_stages.id = " + "tasks.stage where task_stages.list_id = ?1 and tasks.name like ?2"; + case MOD_TASK_NAME: + return "update tasks set name = ?1 where id = ?2"; + case MOD_TASK_DESCRIPTION: + return "update tasks set desc = ?1 where id = ?2"; + case DEL_TASK: + return "delete from tasks where id = ?1"; + case _KLIST_SQL_COUNT: return ""; + } + return ""; } diff --git a/src/main/util.c b/src/main/util.c index 53208d1..3d8e0ec 100644 --- a/src/main/util.c +++ b/src/main/util.c @@ -1,5 +1,5 @@ -#include #include +#include #include "util.h" @@ -13,69 +13,74 @@ */ klist *klist_init(char *db) { - klist *ctx = malloc(sizeof(klist)); - ctx->stmts = malloc(_KLIST_SQL_COUNT * sizeof(sqlite3_stmt *)); - ctx->cmd_ctx = NULL; - ctx->error = 0; + klist *ctx = malloc(sizeof(klist)); + ctx->stmts = malloc(_KLIST_SQL_COUNT * sizeof(sqlite3_stmt *)); + ctx->cmd_ctx = NULL; + ctx->error = 0; - klist_sql_prepare(ctx, db); + klist_sql_prepare(ctx, db); - return ctx; + return ctx; } void klist_deinit(klist *ctx) { - int i = 0; - for (; i < _KLIST_SQL_COUNT; i++) - sqlite3_finalize(ctx->stmts[i]); - sqlite3_close(ctx->db); - //if (ctx->cmd_ctx) free(ctx->cmd_ctx); - free(ctx->stmts); - free(ctx); + int i = 0; + for (; i < _KLIST_SQL_COUNT; i++) + sqlite3_finalize(ctx->stmts[i]); + sqlite3_close(ctx->db); + // if (ctx->cmd_ctx) free(ctx->cmd_ctx); + free(ctx->stmts); + free(ctx); } klist_user_context *klist_user_context_init(klist *list) { - klist_user_context *ctx = malloc(sizeof(klist_user_context)); - ctx->cmd = -1; - return ctx; -} -void klist_user_context_deinit(klist_user_context *ctx) { - free(ctx); + klist_user_context *ctx = malloc(sizeof(klist_user_context)); + ctx->cmd = -1; + return ctx; } +void klist_user_context_deinit(klist_user_context *ctx) { free(ctx); } klist_list_context *klist_list_context_init(klist *list) { - klist_list_context *ctx = malloc(sizeof(klist_list_context)); - ctx->cmd = -1; - ctx->name = NULL; - ctx->desc = NULL; - ctx->stages = NULL; - ctx->stages_len = 0; - ctx->preset = NULL; - return ctx; + klist_list_context *ctx = malloc(sizeof(klist_list_context)); + ctx->cmd = -1; + ctx->name = NULL; + ctx->desc = NULL; + ctx->stages = NULL; + ctx->stages_len = 0; + ctx->preset = NULL; + return ctx; } void klist_list_context_deinit(klist_list_context *ctx) { - if (ctx->name) free(ctx->name); - if (ctx->desc) free(ctx->desc); - if (ctx->preset) free(ctx->preset); - if (ctx->stages) { - int i = 0; - for (; i < ctx->stages_len; i++) free(ctx->stages[i]); - free(ctx->stages); - } - free(ctx); + if (ctx->name) + free(ctx->name); + if (ctx->desc) + free(ctx->desc); + if (ctx->preset) + free(ctx->preset); + if (ctx->stages) { + int i = 0; + for (; i < ctx->stages_len; i++) + free(ctx->stages[i]); + free(ctx->stages); + } + free(ctx); } klist_task_context *klist_task_context_init(klist *list) { - klist_task_context *ctx = malloc(sizeof(klist_task_context)); - ctx->cmd = -1; - ctx->name = NULL; - ctx->list = NULL; - ctx->stage = NULL; - return ctx; + klist_task_context *ctx = malloc(sizeof(klist_task_context)); + ctx->cmd = -1; + ctx->name = NULL; + ctx->list = NULL; + ctx->stage = NULL; + return ctx; } void klist_task_context_deinit(klist_task_context *ctx) { - if (ctx->name) free(ctx->name); - if (ctx->list) free(ctx->list); - if (ctx->stage) free(ctx->stage); - free(ctx); + if (ctx->name) + free(ctx->name); + if (ctx->list) + free(ctx->list); + if (ctx->stage) + free(ctx->stage); + free(ctx); } /* @@ -83,43 +88,43 @@ void klist_task_context_deinit(klist_task_context *ctx) { */ void klist_sql_prepare(klist *ctx, char *db) { - if (sqlite3_open(db ? db : ":memory:", &ctx->db) != SQLITE_OK) { - fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(ctx->db)); - return; - } - char *errmsg = NULL; - sqlite3_exec(ctx->db, klist_sql_get(INIT), NULL, NULL, &errmsg); - if (errmsg) { - fprintf(stderr, "Database initialization failed (%s), expect issues.\n", sqlite3_errmsg(ctx->db)); - sqlite3_free(errmsg); - } - int i = 0; - for (; i < _KLIST_SQL_COUNT; i++) - if (sqlite3_prepare(ctx->db, klist_sql_get(i), -1, &ctx->stmts[i], NULL) != SQLITE_OK) - fprintf(stderr, "sqlite3_prepare: %s\n", sqlite3_errmsg(ctx->db)); + if (sqlite3_open(db ? db : ":memory:", &ctx->db) != SQLITE_OK) { + fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(ctx->db)); + return; + } + char *errmsg = NULL; + sqlite3_exec(ctx->db, klist_sql_get(INIT), NULL, NULL, &errmsg); + if (errmsg) { + fprintf(stderr, "Database initialization failed (%s), expect issues.\n", + sqlite3_errmsg(ctx->db)); + sqlite3_free(errmsg); + } + int i = 0; + for (; i < _KLIST_SQL_COUNT; i++) + if (sqlite3_prepare(ctx->db, klist_sql_get(i), -1, &ctx->stmts[i], NULL) != + SQLITE_OK) + fprintf(stderr, "sqlite3_prepare: %s\n", sqlite3_errmsg(ctx->db)); } -void klist_sql_seed(klist *ctx) { - -} +void klist_sql_seed(klist *ctx) {} /* * assuring things */ bool klist_assure_user(klist *ctx, __uid_t id, char *name) { - klist_user *user = klist_user_get_by_local(ctx, id); - bool created = false; - if (!user) { - user = klist_user_init(); - user->name = malloc((strlen(name) + 1) * sizeof(char)); - strcpy((char *)user->name, name); - user->local_id = id; - klist_user_save(ctx, user); - created = true; - } - klist_user_deinit(user); - return created; + klist_user *user = klist_user_get_by_local(ctx, id); + bool created = false; + if (!user) { + user = klist_user_init(); + user->name = malloc((strlen(name) + 1) * sizeof(char)); + strcpy((char *)user->name, name); + user->local_id = id; + klist_user_save(ctx, user); + created = true; + } + klist_user_deinit(user); + return created; } void klist_assure_list(klist *, char *); void klist_assure_task(klist *, char *); \ No newline at end of file