Files
zern/examples/sqlite_todo.zr
2026-06-06 19:41:54 +02:00

69 lines
2.0 KiB
Plaintext

// needs to be compiled with -m -C "-lsqlite3"
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
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 := str.parse_i64(io.read_line())
if choice == 0
break
else if choice == 1
io.println("============")
sqlite3_prepare_v2(db, "SELECT * FROM todo", -1, ^stmt, 0)
while sqlite3_step(stmt) == 100
id := sqlite3_column_int(stmt, 0)
task := sqlite3_column_text(stmt, 1)
io.printf("%d - %s\n", id, task)
io.println("============")
else if choice == 2
io.print("\nEnter new task: ")
task := str.trim(io.read_line())
sqlite3_prepare_v2(db, "INSERT INTO todo(task) VALUES (?);", -1, ^stmt, 0)
sqlite3_bind_text(stmt, 1, task, -1, 0)
if sqlite3_step(stmt) != 101
panic(sqlite3_errmsg(db))
io.println("\nTask added\n")
else if choice == 3
io.print("\nEnter task id: ")
id := str.parse_i64(io.read_line())
sqlite3_prepare_v2(db, "DELETE FROM todo WHERE id = ?;", -1, ^stmt, 0)
sqlite3_bind_int(stmt, 1, id, -1, 0)
if sqlite3_step(stmt) != 101
panic(sqlite3_errmsg(db))
io.println("\nTask deleted\n")
sqlite3_finalize(stmt)