diff options
| author | dam <dam@gudinoff> | 2022-12-15 17:50:18 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2022-12-15 17:50:18 +0000 |
| commit | 22f5c6099fb9764256bbaa4b990c9bdf68845a3f (patch) | |
| tree | 423892727544f29806ebd4dd560bd0d30116e1b0 | |
| parent | 380d0f24426a7abd0630872c43cd68c2c7058b54 (diff) | |
| download | task-time-tracker-22f5c6099fb9764256bbaa4b990c9bdf68845a3f.tar.zst task-time-tracker-22f5c6099fb9764256bbaa4b990c9bdf68845a3f.zip | |
Added safeguards to avoid discarding entries in case they do not fit on memory. Added error messages in app.
| -rw-r--r-- | main.c | 41 | ||||
| -rw-r--r-- | readme.md | 1 |
2 files changed, 27 insertions, 15 deletions
@@ -650,6 +650,7 @@ bool import_from_csv(database_st *db, const char *path) { // Parse CSV file. char *csv_buffer = NULL; size_t csv_buffer_size = 0; + bool success = true; while(getline(&csv_buffer, &csv_buffer_size, file) != -1) { // Check if reached EOF. // Find task name string limits. @@ -664,7 +665,7 @@ bool import_from_csv(database_st *db, const char *path) { // Prepare new task. task_st *task; - create_task(db, &task); + success &= create_task(db, &task); // Import task name. memcpy(task->name, csv_buffer, name_length); @@ -690,7 +691,7 @@ bool import_from_csv(database_st *db, const char *path) { fclose(file); free(csv_buffer); - return true; + return success; } // Appends task to the end of the CSV file. @@ -1337,8 +1338,10 @@ int main(int argc, char *argv[]) { static layout_st *layout = &layouts[L_COMPACT]; task_st *active_task = get_active_task(db); task_st *selected_task = get_selected_task(db); - int selected_task_row = is_terminal_too_small ? 0 : (db->selected_task % layout_tasks_rows) + NUM_HEADER_ROWS; - int action_style = A_BOLD | COLOR_PAIR(selected_task == active_task ? STYLE_ACTIVE : STYLE_SELECTED_INVERTED); + int action_style = A_BOLD | COLOR_PAIR(selected_task == active_task && selected_task != NULL ? STYLE_ACTIVE : STYLE_SELECTED_INVERTED); + int selected_task_row = is_terminal_too_small ? 0 + : (db->selected_task < 0) ? 1 + : (db->selected_task % layout_tasks_rows) + NUM_HEADER_ROWS; timeout(INPUT_AWAIT_INF); update_times(&database); @@ -1383,13 +1386,15 @@ int main(int argc, char *argv[]) { case 'n': case 'N':{ - // Create new task. - task_st *new_task; - if (create_task(db, &new_task) == false) { - // TODO ERROR + if (db->count == MAX_DATABASE_TASKS) { + read_enter_confirmation(selected_task_row, action_style, " Database is full. "); break; } + // Create new task. + task_st *new_task; + create_task(db, &new_task); + // Set new task name. time_t now_utc = time(NULL); struct tm *now_local = localtime(&now_utc); @@ -1621,7 +1626,11 @@ int main(int argc, char *argv[]) { case '\t': { if (db == &database) { - import_from_csv(&archive, ar_file_path); + if (import_from_csv(&archive, ar_file_path) == false) { + reset_database(&archive); + read_enter_confirmation(selected_task_row, action_style, " Archive too big. "); + break; + } db = &archive; } else { @@ -1637,9 +1646,10 @@ int main(int argc, char *argv[]) { if (db != &database || selected_task == NULL || selected_task == active_task) { break; } - append_to_csv(selected_task, ar_file_path); - delete_task(&database, selected_task); - trigger_autosave(); + if (append_to_csv(selected_task, ar_file_path) == true) { + delete_task(&database, selected_task); + trigger_autosave(); + } break; } @@ -1648,9 +1658,10 @@ int main(int argc, char *argv[]) { if (db != &archive || selected_task == NULL) { break; } - duplicate_task(&database, selected_task); - delete_task(&archive, selected_task); - trigger_autosave(); + if (duplicate_task(&database, selected_task) == true) { + delete_task(&archive, selected_task); + trigger_autosave(); + } break; } @@ -72,4 +72,5 @@ Task Time Tracker - By having each column-print job decoulpled, we avoid havint to measure and compensate lengths of UTF8 strings; - [x] Review all code for bugs related to auto-cast on ptrdiff_t (signed/unsigned); - [x] Review all code for bugs related to auto-cast on size_t (signed/unsigned); +- [ ] Hide stderr messages from app screen. - [ ] Go over all `TODO` items; |
