// 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 let rc = 0 let db = 0 let stmt = 0 rc = sqlite3_open("todo.db", @db) if rc dbg.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 dbg.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> ") let choice: i64 = io.read_line() |> str.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) == 100 let id: i64 = sqlite3_column_int(stmt, 0) let task: str = sqlite3_column_text(stmt, 1) io.print_i64(id) io.print(" - ") io.println(task) io.println("============") else if choice == 2 io.print("\nEnter new task: ") let task: str = io.read_line() |> str.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) != 101 dbg.panic(sqlite3_errmsg(db)) io.println("\nTask added\n") else if choice == 3 io.print("\nEnter task id: ") let id: i64 = io.read_line() |> str.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) != 101 dbg.panic(sqlite3_errmsg(db)) io.println("\nTask deleted\n") sqlite3_finalize(stmt)