// showcase.mko — struct, database, errors, ownership, arenas, concurrency // Run: mako run examples/showcase.mko #[derive(json)] struct Task { id: int title: string done: int } fn create_table(db: SqlDB) -> Result[int, string] { let rc = sql_exec_plain(db, "CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, title TEXT, done INTEGER)") if rc != 0 { return error("create table failed") } Ok(0) } fn insert_task(db: SqlDB, title: string) -> Result[int, string] { let rc = sql_exec_str4(db, "INSERT INTO tasks (title, done) VALUES ($1, $2)", title, "0", "", "") if rc != 0 { return error("insert failed") } Ok(0) } fn get_task(db: SqlDB, title: string) -> string { let row = sql_query_str(db, "SELECT title FROM tasks WHERE title = $1", title) return row } fn worker(ch: chan[int], id: int, results: CMap) -> int { arena a { let label = arena_text(a, format_int(id)) while true { let task_id = ch.recv() if task_id == 0 { break } let msg = "worker " + label + " processed task " + format_int(task_id) cmap_set(results, format_int(task_id), msg) } } return id } fn main() { // database setup let db = sql_open_sqlite("/tmp/mako_showcase.db") let _ = create_table(db) // insert some tasks let titles = ["build parser", "write tests", "deploy service", "fix bug", "review PR"] for i in 5 { let r = insert_task(db, titles[i]) match r { Ok(_) => {} Err(e) => print("insert error: " + e) } } // query back let found = get_task(db, "write tests") if str_eq(found, "") { print("error: task not found") } else { print("found: " + found) } // concurrent workers with shared results let results = cmap_new() let ch = chan_new(10) crew t { let w1 = t.kick(worker(ch, 1, results)) let w2 = t.kick(worker(ch, 2, results)) let w3 = t.kick(worker(ch, 3, results)) for i in 5 { let _ = ch.send(i + 1) } let _ = ch.send(0) let _ = ch.send(0) let _ = ch.send(0) let _ = w1.join() let _ = w2.join() let _ = w3.join() } // print results for i in 5 { print(cmap_get(results, format_int(i + 1))) } let _ = sql_close(db) let _ = remove_file("/tmp/mako_showcase.db") print("done") }