more sql and convenience initializer/getter and cleaner code
This commit is contained in:
parent
bcb08712c6
commit
e0610cee1c
7 changed files with 207 additions and 21 deletions
|
@ -1,3 +1,4 @@
|
||||||
add_executable(klist main.c sql.c util.c)
|
add_executable(klist main.c sql.c util.c models.c)
|
||||||
target_include_directories(klist PRIVATE include)
|
target_include_directories(klist PRIVATE include)
|
||||||
target_link_libraries(klist sqlite3)
|
target_link_libraries(klist sqlite3)
|
||||||
|
target_compile_options(klist PRIVATE -Werror -Wall) #-Wextra)
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
struct klist_user {
|
struct klist_user {
|
||||||
ssize_t id;
|
ssize_t id;
|
||||||
char *name;
|
unsigned char *name;
|
||||||
ssize_t local_id;
|
ssize_t local_id;
|
||||||
ssize_t discord_id;
|
ssize_t discord_id;
|
||||||
ssize_t google_id;
|
ssize_t google_id;
|
||||||
|
@ -14,43 +14,50 @@ struct klist_user {
|
||||||
typedef struct klist_user klist_user;
|
typedef struct klist_user klist_user;
|
||||||
|
|
||||||
klist_user *klist_user_init();
|
klist_user *klist_user_init();
|
||||||
|
klist_user *klist_user_init_from_sql(sqlite3_stmt *);
|
||||||
klist_user *klist_user_get_by_id(klist *, u_int);
|
klist_user *klist_user_get_by_id(klist *, u_int);
|
||||||
klist_user *klist_user_get_by_local(klist *, char *);
|
klist_user *klist_user_get_by_local(klist *, u_int);
|
||||||
klist_user *klist_user_get_by_discord(klist *, char *);
|
klist_user *klist_user_get_by_discord(klist *, u_int);
|
||||||
klist_user *klist_user_get_by_google(klist *, char *);
|
klist_user *klist_user_get_by_google(klist *, u_int);
|
||||||
void klist_user_deinit(klist_user *);
|
void klist_user_deinit(klist_user *);
|
||||||
|
|
||||||
|
|
||||||
struct klist_stage {
|
struct klist_stage {
|
||||||
ssize_t id;
|
ssize_t id;
|
||||||
char *name;
|
unsigned char *name;
|
||||||
char *desc;
|
unsigned char *desc;
|
||||||
|
ssize_t list_id;
|
||||||
};
|
};
|
||||||
typedef struct klist_stage klist_stage;
|
typedef struct klist_stage klist_stage;
|
||||||
|
|
||||||
klist_stage *klist_stage_init();
|
klist_stage *klist_stage_init();
|
||||||
|
klist_stage *klist_stage_init_from_sql(sqlite3_stmt *);
|
||||||
|
klist_stage *klist_stage_get_by_id(klist *, u_int);
|
||||||
void klist_stage_deinit(klist_stage *);
|
void klist_stage_deinit(klist_stage *);
|
||||||
|
|
||||||
|
|
||||||
struct klist_list {
|
struct klist_list {
|
||||||
ssize_t id;
|
ssize_t id;
|
||||||
char *name;
|
unsigned char *name;
|
||||||
char *desc;
|
unsigned char *desc;
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef struct klist_list klist_list;
|
typedef struct klist_list klist_list;
|
||||||
|
|
||||||
klist_list *klist_list_init();
|
klist_list *klist_list_init();
|
||||||
|
klist_list *klist_list_init_from_sql(sqlite3_stmt *);
|
||||||
|
klist_list *klist_list_get_by_id(klist *, u_int);
|
||||||
|
klist_list **klist_list_get_all_by_user(klist *, u_int, size_t *);
|
||||||
void klist_list_deinit(klist_list *);
|
void klist_list_deinit(klist_list *);
|
||||||
|
|
||||||
|
|
||||||
struct klist_task {
|
struct klist_task {
|
||||||
ssize_t id;
|
ssize_t id;
|
||||||
char *name;
|
unsigned char *name;
|
||||||
char *desc;
|
unsigned char *desc;
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef struct klist_task klist_task;
|
typedef struct klist_task klist_task;
|
||||||
|
|
||||||
klist_task *klist_task_init();
|
klist_task *klist_task_init();
|
||||||
|
klist_task *klist_task_init_from_sql(sqlite3_stmt *);
|
||||||
|
klist_task *klist_task_get_by_id(klist *, u_int);
|
||||||
void klist_task_deinit(klist_task *);
|
void klist_task_deinit(klist_task *);
|
|
@ -5,6 +5,9 @@ enum KLIST_SQL {
|
||||||
INIT,
|
INIT,
|
||||||
ADD_USER,
|
ADD_USER,
|
||||||
GET_USER,
|
GET_USER,
|
||||||
|
GET_USER_BY_LOCAL,
|
||||||
|
GET_USER_BY_DISCORD,
|
||||||
|
GET_USER_BY_GOOGLE,
|
||||||
GET_USERS,
|
GET_USERS,
|
||||||
MOD_USER_NAME,
|
MOD_USER_NAME,
|
||||||
MOD_USER_LOCAL,
|
MOD_USER_LOCAL,
|
||||||
|
@ -13,6 +16,7 @@ enum KLIST_SQL {
|
||||||
ADD_LIST,
|
ADD_LIST,
|
||||||
GET_LIST,
|
GET_LIST,
|
||||||
GET_LISTS,
|
GET_LISTS,
|
||||||
|
GET_LISTS_BY_USER,
|
||||||
MOD_LIST_NAME,
|
MOD_LIST_NAME,
|
||||||
DEL_LIST,
|
DEL_LIST,
|
||||||
ADD_STAGE,
|
ADD_STAGE,
|
||||||
|
|
|
@ -46,7 +46,7 @@ enum klist_list_command {
|
||||||
LIST_DELETE,
|
LIST_DELETE,
|
||||||
};
|
};
|
||||||
struct klist_list_context {
|
struct klist_list_context {
|
||||||
enum klist_user_command cmd;
|
enum klist_list_command cmd;
|
||||||
char *name;
|
char *name;
|
||||||
char **stages;
|
char **stages;
|
||||||
size_t stages_len;
|
size_t stages_len;
|
||||||
|
|
|
@ -20,19 +20,17 @@ int main(int argc, char **argv) {
|
||||||
setup(ctx, argc, argv);
|
setup(ctx, argc, argv);
|
||||||
switch (ctx->cmd) {
|
switch (ctx->cmd) {
|
||||||
case USER:
|
case USER:
|
||||||
switch (((klist_list_context *)ctx->cmd_ctx)->cmd) {
|
switch (((klist_user_context *)ctx->cmd_ctx)->cmd) {
|
||||||
case USER_GET:
|
case USER_GET:
|
||||||
|
|
||||||
case USER_DELETE:
|
case USER_DELETE:
|
||||||
default: ;
|
default: ;
|
||||||
}
|
}
|
||||||
case LIST:
|
case LIST:
|
||||||
switch (((klist_user_context *)ctx->cmd_ctx)->cmd) {
|
switch (((klist_list_context *)ctx->cmd_ctx)->cmd) {
|
||||||
case LIST_ADD:
|
case LIST_ADD:
|
||||||
case LIST_EDIT:
|
case LIST_EDIT:
|
||||||
case LIST_GET:
|
case LIST_GET:
|
||||||
case LIST_DELETE:
|
case LIST_DELETE: ;
|
||||||
default: ;
|
|
||||||
}
|
}
|
||||||
case TASK:
|
case TASK:
|
||||||
switch (((klist_task_context *)ctx->cmd_ctx)->cmd) {
|
switch (((klist_task_context *)ctx->cmd_ctx)->cmd) {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#include "models.h"
|
#include "models.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "sql.h"
|
||||||
|
|
||||||
klist_user *klist_user_init() {
|
klist_user *klist_user_init() {
|
||||||
klist_user *user = malloc(sizeof(klist_user));
|
klist_user *user = malloc(sizeof(klist_user));
|
||||||
|
@ -11,8 +14,177 @@ klist_user *klist_user_init() {
|
||||||
user->google_id = -1;
|
user->google_id = -1;
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
klist_user *klist_user_get_by_id(klist *ctx, u_int id);
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
if (sqlite3_column_type(stmt, 2) != SQLITE_NULL) user->local_id = sqlite3_column_int(stmt, 2);
|
||||||
|
if (sqlite3_column_type(stmt, 3) != SQLITE_NULL) user->discord_id = sqlite3_column_int(stmt, 3);
|
||||||
|
if (sqlite3_column_type(stmt, 4) != SQLITE_NULL) user->google_id = sqlite3_column_int(stmt, 4);
|
||||||
|
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_reset(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_reset(stmt);
|
||||||
|
return klist_user_init_from_sql(stmt);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void klist_user_deinit(klist_user *user) {
|
void klist_user_deinit(klist_user *user) {
|
||||||
free(user->name);
|
free(user->name);
|
||||||
free(user);
|
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 *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 *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_reset(stmt);
|
||||||
|
return klist_stage_init_from_sql(stmt);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void klist_stage_deinit(klist_stage *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;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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_reset(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++;
|
||||||
|
lists = realloc(lists, lists_len * sizeof(klist_list *));
|
||||||
|
lists[lists_len - 1] = klist_list_init(stmt);
|
||||||
|
}
|
||||||
|
if (count != NULL) *count = lists_len;
|
||||||
|
return lists;
|
||||||
|
}
|
||||||
|
|
||||||
|
void klist_list_deinit(klist_list *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 *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 *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_reset(stmt);
|
||||||
|
return klist_task_init_from_sql(stmt);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void klist_task_deinit(klist_task *task) {
|
||||||
|
if (task->name) free(task->name);
|
||||||
|
if (task->desc) free(task->desc);
|
||||||
|
free(task);
|
||||||
|
}
|
||||||
|
|
|
@ -41,6 +41,9 @@ char *klist_sql_get(const enum KLIST_SQL sql) {
|
||||||
")";
|
")";
|
||||||
case ADD_USER: return "insert into users values (?1, ?2, ?3, ?4)";
|
case ADD_USER: return "insert into users values (?1, ?2, ?3, ?4)";
|
||||||
case GET_USER: return "select * from users where id = ?1";
|
case GET_USER: return "select * from users where id = ?1";
|
||||||
|
case GET_USER_BY_LOCAL: return "select * from users where local_id = ?1";
|
||||||
|
case GET_USER_BY_DISCORD: return "select * from users where discord_id = ?1";
|
||||||
|
case GET_USER_BY_GOOGLE: return "select * from users where google_id = ?1";
|
||||||
case GET_USERS: return "select * from users";
|
case GET_USERS: return "select * from users";
|
||||||
case MOD_USER_NAME: return "update users set name = ?1 where id = ?2";
|
case MOD_USER_NAME: return "update users set name = ?1 where id = ?2";
|
||||||
case MOD_USER_LOCAL: return "update users set local_id = ?1 where id = ?2";;
|
case MOD_USER_LOCAL: return "update users set local_id = ?1 where id = ?2";;
|
||||||
|
@ -49,6 +52,7 @@ char *klist_sql_get(const enum KLIST_SQL sql) {
|
||||||
case ADD_LIST: return "insert into lists values (?1, ?2)";
|
case ADD_LIST: return "insert into lists values (?1, ?2)";
|
||||||
case GET_LIST: return "select * from lists where id = ?1";
|
case GET_LIST: return "select * from lists where id = ?1";
|
||||||
case GET_LISTS: return "select * from lists";
|
case GET_LISTS: return "select * from lists";
|
||||||
|
case GET_LISTS_BY_USER: return "select * from lists where id = (select list_id from user_lists where user_id = ?1)";
|
||||||
case MOD_LIST_NAME: return "update lists set name = ?1 where id = ?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 DEL_LIST: return "delete from lists where id = ?1";
|
||||||
case ADD_STAGE: return "insert into task_stages values (?1, ?2, ?3)";
|
case ADD_STAGE: return "insert into task_stages values (?1, ?2, ?3)";
|
||||||
|
|
Loading…
Add table
Reference in a new issue