diff --git a/src/main/main.c b/src/main/main.c index 10cf53d..16ea997 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -165,8 +165,8 @@ int main(int argc, char **argv) { stage_id = stages[i]->id; if (stage_id == -1) { - fprintf(stderr, "Stage %s not found. Use one of: ", - (char *)task_ctx->stage); + fprintf(stderr, + "Stage %s not found. Use one of: ", task_ctx->stage); i = 0; for (; i < stages_len; i++) fprintf(stderr, "%s ", (char *)stages[i]->name); @@ -231,7 +231,7 @@ int main(int argc, char **argv) { } } } else - fprintf(stderr, "List not found"); + fprintf(stderr, "list not found\n"); case TASK_DELETE: klist_assure_user(ctx, getuid(), getlogin()); 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) switch (opt) { - case 'a': + /*case 'a': task_ctx->cmd = TASK_ADD; break; case 'e': task_ctx->cmd = TASK_EDIT; - break; + break;*/ case 'd': task_ctx->cmd = TASK_DELETE; break; @@ -390,6 +390,8 @@ void setup(klist *ctx, int argc, char **argv) { "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; break; default: diff --git a/src/main/models.c b/src/main/models.c index 3a890a0..ae5cddc 100644 --- a/src/main/models.c +++ b/src/main/models.c @@ -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)); if (sqlite3_column_bytes(stmt, 2) > 0) 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; } @@ -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); if (sqlite3_step(stmt) == SQLITE_ROW) 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); 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) { 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->id > -1) + sqlite3_bind_int(stmt, 1, task->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) - sqlite3_bind_int(stmt, 4, task->due); + sqlite3_bind_int(stmt, 5, task->due); 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) { task->id = sqlite3_column_int(stmt, 0); } else diff --git a/src/main/sql.c b/src/main/sql.c index a0cd189..87dd18f 100644 --- a/src/main/sql.c +++ b/src/main/sql.c @@ -1,5 +1,11 @@ #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) { switch (sql) { case INIT: @@ -95,8 +101,9 @@ const char *klist_sql_get(const enum KLIST_SQL sql) { 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) on conflict (id) do update set " + return "insert into tasks (id, name, desc, stage, due, target_stage) " + "values " + "(?1, ?2, ?3, ?4, ?5, ?6) on conflict (id) do update set " "name=excluded.name, desc=excluded.desc, stage=excluded.stage, " "due=excluded.due, target_stage=excluded.target_stage returning id"; 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"; 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"; + "tasks.stage where task_stages.list_id = ?1 and tasks.name = ?2"; case MOD_TASK_NAME: return "update tasks set name = ?1 where id = ?2"; case MOD_TASK_DESCRIPTION: