package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/joaoh82/rust_sqlite/sdk/go"
)
func main() {
db, err := sql.Open("sqlrite", ":memory:")
if err != nil {
log.Fatalf("open: %v", err)
}
defer db.Close()
mustExec(db, "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
mustExec(db, "INSERT INTO users (name, age) VALUES ('alice', 30)")
mustExec(db, "INSERT INTO users (name, age) VALUES ('bob', 25)")
mustExec(db, "INSERT INTO users (name, age) VALUES ('carol', 40)")
fmt.Println("All users:")
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
log.Fatalf("query: %v", err)
}
for rows.Next() {
var id, age int64
var name string
if err := rows.Scan(&id, &name, &age); err != nil {
log.Fatalf("scan: %v", err)
}
fmt.Printf(" %d: %s (%d)\n", id, name, age)
}
rows.Close()
fmt.Println()
tx, err := db.Begin()
if err != nil {
log.Fatalf("begin: %v", err)
}
mustTxExec(tx, "INSERT INTO users (name, age) VALUES ('phantom', 99)")
fmt.Printf("Mid-transaction row count: %d\n", countRows(tx, "SELECT id FROM users"))
if err := tx.Rollback(); err != nil {
log.Fatalf("rollback: %v", err)
}
fmt.Printf("Post-rollback row count: %d\n", countRows(db, "SELECT id FROM users"))
}
type queryer interface {
Query(query string, args ...any) (*sql.Rows, error)
}
func mustExec(db *sql.DB, q string) {
if _, err := db.Exec(q); err != nil {
log.Fatalf("exec %q: %v", q, err)
}
}
func mustTxExec(tx *sql.Tx, q string) {
if _, err := tx.Exec(q); err != nil {
log.Fatalf("tx.Exec %q: %v", q, err)
}
}
func countRows(q queryer, sqlText string) int {
rows, err := q.Query(sqlText)
if err != nil {
log.Fatalf("query: %v", err)
}
defer rows.Close()
n := 0
for rows.Next() {
n++
}
return n
}