Modified gen_sql_update_stmt to use bind, now prepare_sql_update_stmt

This commit is contained in:
xavi 2024-09-21 22:57:04 -07:00
parent b55a6bdb04
commit 19778cc114
2 changed files with 84 additions and 26 deletions

View File

@ -45,7 +45,6 @@ int gen_sql_update_stmt_v2(sqlite3 *db, sqlite3_stmt** out_stmt, filtered_tasks*
int rc = 0; int rc = 0;
if (task->new_title != NULL && task->due_date != NULL){ if (task->new_title != NULL && task->due_date != NULL){
// TODO: we might want to have a function that builds the final sql_query
snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET title='%s', due_date='%s' WHERE title='%s' OR active_id='%d'", task->new_title, task->due_date, task->title, task->active_id); snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET title='%s', due_date='%s' WHERE title='%s' OR active_id='%d'", task->new_title, task->due_date, task->title, task->active_id);
} }
else if (task->new_title != NULL){ else if (task->new_title != NULL){
@ -67,27 +66,71 @@ int gen_sql_update_stmt_v2(sqlite3 *db, sqlite3_stmt** out_stmt, filtered_tasks*
} }
int gen_sql_update_stmt(sqlite3 *db, sqlite3_stmt** out_stmt, filtered_tasks* task){ char* concat_with_mem_cleanup(char* str1, char* str2){
char sql_query[SQLQUERY_MAX]; char *temp;
if ( str1 == NULL || str2 == NULL ){
return NULL;
}
temp = str1;
str1 = x_strconcat(str1, str2);
free(temp);
return str1;
}
int prepare_sql_update_stmt(sqlite3 *db, sqlite3_stmt** out_stmt, filtered_tasks* task){
char *sql_query;
int rc = 0; int rc = 0;
int num_params = 0;
sql_query = malloc(SQLQUERY_MAX * sizeof(char));
if (task->new_title != NULL && task->due_date != NULL){ x_strcpy(sql_query,"UPDATE tasks SET ", SQLQUERY_MAX);
// TODO: we might want to have a function that builds the final sql_query
snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET title='%s', due_date='%s' WHERE title='%s' OR active_id='%d'", task->new_title, task->due_date, task->title, task->active_id); if ( task->new_title ){
} sql_query = concat_with_mem_cleanup(sql_query, "title=?");
else if (task->status != NULL){ num_params++;
snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET status='%s' WHERE title='%s' OR active_id='%d'",
task->status, task->title, task->active_id);
}
else{
snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET active_id='NULL',status='complete' WHERE title='%s' OR active_id='%d'", task->title, task->active_id);
} }
rc = sqlite3_prepare_v2(db, sql_query, -1, out_stmt, NULL); if ( task->due_date ){
if (checksqlerr(rc, "prepare broken in gen_sql_insert_stmt")){ if ( num_params > 0 ){
return -1; sql_query = concat_with_mem_cleanup(sql_query, ",");
} }
sql_query = concat_with_mem_cleanup(sql_query, "due_date=?");
num_params++;
}
if ( task->status ){
if ( num_params > 0 ){
sql_query = concat_with_mem_cleanup(sql_query, ",");
}
sql_query = concat_with_mem_cleanup(sql_query, "status=?");
num_params++;
if ( !(x_strcmp(task->status, "complete")) ){
sql_query = concat_with_mem_cleanup(sql_query, ",");
sql_query = concat_with_mem_cleanup(sql_query, "active_id='NULL'");
num_params++;
}
}
//if (task->status != NULL){
// snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET status='%s' WHERE title='%s' OR active_id='%d'",
// task->status, task->title, task->active_id);
//}
//else{
// snprintf(sql_query, SQLQUERY_MAX, "UPDATE tasks SET active_id='NULL',status='complete' WHERE title='%s' OR active_id='%d'", task->title, task->active_id);
//}
//rc = sqlite3_prepare_v2(db, sql_query, -1, out_stmt, NULL);
//if (checksqlerr(rc, "prepare broken in gen_sql_insert_stmt")){
// return -1;
//}
return 0; return 0;
} }
@ -444,7 +487,7 @@ int update_task_status(sqlite3 *db, int argc, char** argv){
parse_args(argc, argv, task); parse_args(argc, argv, task);
task->status = argv[1]; task->status = argv[1];
if ( gen_sql_update_stmt(db, &out_stmt, task) ){ if ( prepare_sql_update_stmt(db, &out_stmt, task) ){
free(task); free(task);
return -1; return -1;
} }
@ -470,7 +513,7 @@ int complete_task(sqlite3 *db, int argc, char** argv){
init_filtered_tasks(task); init_filtered_tasks(task);
parse_args(argc, argv, task); parse_args(argc, argv, task);
if ( gen_sql_update_stmt(db, &out_stmt, task) ){ if ( prepare_sql_update_stmt(db, &out_stmt, task) ){
free(task); free(task);
return -1; return -1;
} }
@ -495,10 +538,14 @@ int update_task(sqlite3 *db, int argc, char** argv){
init_filtered_tasks(task); init_filtered_tasks(task);
parse_args(argc, argv, task); //parse_args(argc, argv, task);
// TODO this can definitely be made into one func with all the other updates // TODO this can definitely be made into one func with all the other updates
// no v2s allowed // no v2s allowed
if ( gen_sql_update_stmt_v2(db, &out_stmt, task) ){
task->new_title = "cool_beans";
task->due_date = "0303-03-03";
task->status = "complete";
if ( prepare_sql_update_stmt(db, &out_stmt, task) ){
free(task); free(task);
return -1; return -1;
} }

View File

@ -15,7 +15,7 @@
// SET THE NUMBER OF TESTS // SET THE NUMBER OF TESTS
#define NUM_TESTS 6 #define NUM_TESTS 7
// DEFINE REUSABLE TEST SETUPS // DEFINE REUSABLE TEST SETUPS
int set_up_db(sqlite3 **db){ int set_up_db(sqlite3 **db){
@ -133,6 +133,16 @@ int test_update_task(){
printf("%s... ", __func__); printf("%s... ", __func__);
int rc = 0; int rc = 0;
sqlite3 *db; sqlite3 *db;
char *argv_1[3] = {"./dodo", "new", "jello"};
if ( (rc = set_up_db(&db)) ){
return rc;
}
update_task(db, 3, argv_1);
return 1;
} }
@ -168,11 +178,12 @@ int main(){
// PASS TESTS INTO ARRAY // PASS TESTS INTO ARRAY
tests[0] = fail; tests[0] = fail;
tests[1] = test_add_new_task_no_date; tests[1] = test_update_task;
tests[2] = test_del_task; tests[2] = test_add_new_task_no_date;
tests[3] = test_add_new_task_with_date_and_delete; tests[3] = test_del_task;
tests[4] = test_add_then_update_task_status_then_delete; tests[4] = test_add_new_task_with_date_and_delete;
tests[5] = test_display_task; tests[5] = test_add_then_update_task_status_then_delete;
tests[6] = test_display_task;
// END OF PASSING TESTS // END OF PASSING TESTS