-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtodo_list.c
133 lines (112 loc) · 3.65 KB
/
todo_list.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#define MAX_TASK_LENGTH 256
typedef struct {
sqlite3 *db;
} TodoList;
int openDatabase(TodoList *list) {
return sqlite3_open("todo_list.db", &list->db);
}
int createTable(TodoList *list) {
const char *sql = "CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY AUTOINCREMENT, task TEXT NOT NULL);";
char *errMsg = NULL;
return sqlite3_exec(list->db, sql, NULL, NULL, &errMsg);
}
int addTask(TodoList *list, const char *task) {
char sql[MAX_TASK_LENGTH + 50];
snprintf(sql, sizeof(sql), "INSERT INTO tasks (task) VALUES ('%s');", task);
char *errMsg = NULL;
return sqlite3_exec(list->db, sql, NULL, NULL, &errMsg);
}
int viewTasks(TodoList *list) {
const char *sql = "SELECT id, task FROM tasks;";
sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(list->db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
printf("Failed to fetch tasks: %s\n", sqlite3_errmsg(list->db));
return rc;
}
printf("\n=== Tasks ===\n");
while (sqlite3_step(stmt) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const unsigned char *task = sqlite3_column_text(stmt, 1);
printf("%d. %s\n", id, task);
}
printf("=============\n");
sqlite3_finalize(stmt);
return SQLITE_OK;
}
int deleteTask(TodoList *list, int id) {
char sql[50];
snprintf(sql, sizeof(sql), "DELETE FROM tasks WHERE id = %d;", id);
char *errMsg = NULL;
return sqlite3_exec(list->db, sql, NULL, NULL, &errMsg);
}
void closeDatabase(TodoList *list) {
sqlite3_close(list->db);
}
int main() {
TodoList todoList;
int choice;
char task[MAX_TASK_LENGTH];
int taskNumber;
if (openDatabase(&todoList)) {
fprintf(stderr, "Can't open database\n");
return 1;
}
if (createTable(&todoList)) {
fprintf(stderr, "Can't create table\n");
closeDatabase(&todoList);
return 1;
}
do {
printf("\n=== Todo List Menu ===\n");
printf("1. Add Task\n");
printf("2. View Tasks\n");
printf("3. Delete Task\n");
printf("4. Exit\n");
printf("======================\n");
printf("Enter your choice: ");
scanf("%d", &choice);
getchar(); // Clear newline from buffer
switch (choice) {
case 1:
printf("Enter task: ");
fgets(task, sizeof(task), stdin);
task[strcspn(task, "\n")] = '\0'; // Remove newline character
if (addTask(&todoList, task)) {
printf("Failed to add task.\n");
} else {
printf("Task added successfully.\n");
}
break;
case 2:
if (viewTasks(&todoList)) {
printf("Failed to fetch tasks.\n");
}
break;
case 3:
if (viewTasks(&todoList)) {
printf("Failed to fetch tasks.\n");
break;
}
printf("Enter task number to delete: ");
scanf("%d", &taskNumber);
if (deleteTask(&todoList, taskNumber)) {
printf("Failed to delete task.\n");
} else {
printf("Task deleted successfully.\n");
}
break;
case 4:
printf("Exiting...\n");
break;
default:
printf("Invalid choice. Please enter a number between 1 and 4.\n");
}
} while (choice != 4);
closeDatabase(&todoList);
return 0;
}