bug fixing (you can now actually move tasks between stages :3)

This commit is contained in:
theBreadCompany 2025-06-12 13:54:05 +02:00
parent 307c671a65
commit 45d537d264
3 changed files with 30 additions and 13 deletions

View file

@ -165,8 +165,8 @@ int main(int argc, char **argv) {
stage_id = stages[i]->id; stage_id = stages[i]->id;
if (stage_id == -1) { if (stage_id == -1) {
fprintf(stderr, "Stage %s not found. Use one of: ", fprintf(stderr,
(char *)task_ctx->stage); "Stage %s not found. Use one of: ", task_ctx->stage);
i = 0; i = 0;
for (; i < stages_len; i++) for (; i < stages_len; i++)
fprintf(stderr, "%s ", (char *)stages[i]->name); fprintf(stderr, "%s ", (char *)stages[i]->name);
@ -231,7 +231,7 @@ int main(int argc, char **argv) {
} }
} }
} else } else
fprintf(stderr, "List not found"); fprintf(stderr, "list not found\n");
case TASK_DELETE: case TASK_DELETE:
klist_assure_user(ctx, getuid(), getlogin()); klist_assure_user(ctx, getuid(), getlogin());
user = klist_user_get_by_local(ctx, getuid()); user = klist_user_get_by_local(ctx, getuid());
@ -361,12 +361,12 @@ void setup(klist *ctx, int argc, char **argv) {
while ((opt = getopt(argc, argv, "aedl:n:s:")) != -1) while ((opt = getopt(argc, argv, "aedl:n:s:")) != -1)
switch (opt) { switch (opt) {
case 'a': /*case 'a':
task_ctx->cmd = TASK_ADD; task_ctx->cmd = TASK_ADD;
break; break;
case 'e': case 'e':
task_ctx->cmd = TASK_EDIT; task_ctx->cmd = TASK_EDIT;
break; break;*/
case 'd': case 'd':
task_ctx->cmd = TASK_DELETE; task_ctx->cmd = TASK_DELETE;
break; break;
@ -390,6 +390,8 @@ void setup(klist *ctx, int argc, char **argv) {
"Not providing a parameter prints all tasks of a list."); "Not providing a parameter prints all tasks of a list.");
} }
if (task_ctx->cmd != TASK_DELETE)
task_ctx->cmd = TASK_ADD;
ctx->cmd_ctx = task_ctx; ctx->cmd_ctx = task_ctx;
break; break;
default: default:

View file

@ -266,6 +266,9 @@ klist_task *klist_task_init_from_sql(sqlite3_stmt *stmt) {
task->name = (unsigned char *)strdup((char *)sqlite3_column_text(stmt, 1)); task->name = (unsigned char *)strdup((char *)sqlite3_column_text(stmt, 1));
if (sqlite3_column_bytes(stmt, 2) > 0) if (sqlite3_column_bytes(stmt, 2) > 0)
task->desc = (unsigned char *)strdup((char *)sqlite3_column_text(stmt, 2)); task->desc = (unsigned char *)strdup((char *)sqlite3_column_text(stmt, 2));
task->stage_id = sqlite3_column_int(stmt, 3);
task->due = sqlite3_column_int(stmt, 4);
task->target_stage = sqlite3_column_int(stmt, 5);
return task; return task;
} }
@ -305,6 +308,9 @@ klist_task *klist_task_get_for_list_by_name(klist *ctx, u_int list_id,
sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC); sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
if (sqlite3_step(stmt) == SQLITE_ROW) if (sqlite3_step(stmt) == SQLITE_ROW)
task = klist_task_init_from_sql(stmt); task = klist_task_init_from_sql(stmt);
else
fprintf(stderr, "no tasks found for list %d, name '%s': %s\n", list_id,
name, sqlite3_errmsg(ctx->db));
sqlite3_reset(stmt); sqlite3_reset(stmt);
return task; return task;
} }
@ -312,13 +318,15 @@ klist_task *klist_task_get_for_list_by_name(klist *ctx, u_int list_id,
void klist_task_save(klist *ctx, klist_task *task) { void klist_task_save(klist *ctx, klist_task *task) {
sqlite3_stmt *stmt = ctx->stmts[ADD_TASK]; sqlite3_stmt *stmt = ctx->stmts[ADD_TASK];
int result = 0; int result = 0;
sqlite3_bind_text(stmt, 1, (char *)task->name, -1, SQLITE_STATIC); if (task->id > -1)
sqlite3_bind_text(stmt, 2, (char *)task->desc, -1, SQLITE_STATIC); sqlite3_bind_int(stmt, 1, task->id);
sqlite3_bind_int(stmt, 3, task->stage_id); sqlite3_bind_text(stmt, 2, (char *)task->name, -1, SQLITE_STATIC);
sqlite3_bind_text(stmt, 3, (char *)task->desc, -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 4, task->stage_id);
if (task->due) if (task->due)
sqlite3_bind_int(stmt, 4, task->due); sqlite3_bind_int(stmt, 5, task->due);
if (task->target_stage) if (task->target_stage)
sqlite3_bind_int(stmt, 5, task->target_stage); sqlite3_bind_int(stmt, 6, task->target_stage);
if ((result = sqlite3_step(stmt)) == SQLITE_ROW) { if ((result = sqlite3_step(stmt)) == SQLITE_ROW) {
task->id = sqlite3_column_int(stmt, 0); task->id = sqlite3_column_int(stmt, 0);
} else } else

View file

@ -1,5 +1,11 @@
#include "include/sql.h" #include "include/sql.h"
/*
* TODO: update queries so that upserts actually can be used as such.
* details: ids are mostly missing in the insert statements meaning that there
* can be no id conflicts
*/
const char *klist_sql_get(const enum KLIST_SQL sql) { const char *klist_sql_get(const enum KLIST_SQL sql) {
switch (sql) { switch (sql) {
case INIT: case INIT:
@ -95,8 +101,9 @@ const char *klist_sql_get(const enum KLIST_SQL sql) {
case DEL_STAGE: case DEL_STAGE:
return "delete from task_stages where id = ?1"; return "delete from task_stages where id = ?1";
case ADD_TASK: case ADD_TASK:
return "insert into tasks (name, desc, stage, due, target_stage) values " return "insert into tasks (id, name, desc, stage, due, target_stage) "
"(?1, ?2, ?3, ?4, ?5) on conflict (id) do update set " "values "
"(?1, ?2, ?3, ?4, ?5, ?6) on conflict (id) do update set "
"name=excluded.name, desc=excluded.desc, stage=excluded.stage, " "name=excluded.name, desc=excluded.desc, stage=excluded.stage, "
"due=excluded.due, target_stage=excluded.target_stage returning id"; "due=excluded.due, target_stage=excluded.target_stage returning id";
case GET_TASK: case GET_TASK:
@ -108,7 +115,7 @@ const char *klist_sql_get(const enum KLIST_SQL sql) {
"tasks.stage where task_stages.list_id = ?1"; "tasks.stage where task_stages.list_id = ?1";
case GET_TASKS_FOR_LIST_BY_NAME: case GET_TASKS_FOR_LIST_BY_NAME:
return "select tasks.* from tasks join task_stages on task_stages.id = " 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"; "tasks.stage where task_stages.list_id = ?1 and tasks.name = ?2";
case MOD_TASK_NAME: case MOD_TASK_NAME:
return "update tasks set name = ?1 where id = ?2"; return "update tasks set name = ?1 where id = ?2";
case MOD_TASK_DESCRIPTION: case MOD_TASK_DESCRIPTION: