74 lines
2.1 KiB
Plaintext
74 lines
2.1 KiB
Plaintext
// needs to be compiled with -m -C "-lsqlite3"
|
|
include "$/io.zr"
|
|
|
|
extern sqlite3_open
|
|
extern sqlite3_exec
|
|
extern sqlite3_prepare_v2
|
|
extern sqlite3_bind_int
|
|
extern sqlite3_bind_text
|
|
extern sqlite3_step
|
|
extern sqlite3_errmsg
|
|
extern sqlite3_column_int
|
|
extern sqlite3_column_text
|
|
extern sqlite3_finalize
|
|
|
|
const SQLITE_ROW = 100
|
|
const SQLITE_DONE = 101
|
|
|
|
func main[] : i64
|
|
rc := 0
|
|
db := 0
|
|
stmt := 0
|
|
|
|
rc = sqlite3_open("todo.db", ^db)
|
|
if rc
|
|
panic("failed to open db")
|
|
|
|
rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS todo(id INTEGER PRIMARY KEY AUTOINCREMENT, task TEXT NOT NULL);", 0, 0, 0)
|
|
if rc
|
|
panic(sqlite3_errmsg(db))
|
|
|
|
while true
|
|
io.println("1. List tasks")
|
|
io.println("2. Add task")
|
|
io.println("3. Delete task")
|
|
io.println("0. Quit")
|
|
io.print("\n> ")
|
|
|
|
choice := io.read_line()->parse_i64()
|
|
|
|
if choice == 0
|
|
break
|
|
else if choice == 1
|
|
io.println("============")
|
|
sqlite3_prepare_v2(db, "SELECT * FROM todo", -1, ^stmt, 0)
|
|
|
|
while sqlite3_step(stmt) == SQLITE_ROW
|
|
id := sqlite3_column_int(stmt, 0) as i64
|
|
task := sqlite3_column_text(stmt, 1) as str
|
|
io.printf("%d - %s\n", id, task)
|
|
|
|
io.println("============")
|
|
else if choice == 2
|
|
io.print("\nEnter new task: ")
|
|
task := io.read_line()->trim()
|
|
|
|
sqlite3_prepare_v2(db, "INSERT INTO todo(task) VALUES (?);", -1, ^stmt, 0)
|
|
sqlite3_bind_text(stmt, 1, task, -1, 0)
|
|
if sqlite3_step(stmt) != SQLITE_DONE
|
|
panic(sqlite3_errmsg(db))
|
|
|
|
io.println("\nTask added\n")
|
|
else if choice == 3
|
|
io.print("\nEnter task id: ")
|
|
id := io.read_line()->parse_i64()
|
|
|
|
sqlite3_prepare_v2(db, "DELETE FROM todo WHERE id = ?;", -1, ^stmt, 0)
|
|
sqlite3_bind_int(stmt, 1, id, -1, 0)
|
|
if sqlite3_step(stmt) != SQLITE_DONE
|
|
panic(sqlite3_errmsg(db))
|
|
|
|
io.println("\nTask deleted\n")
|
|
|
|
sqlite3_finalize(stmt)
|