-- Showcase the calog db library on SQLite: open an in-memory database, create a
-- table, insert several rows using BOUND parameters (safe from injection), run a
-- SELECT and print each returned row map field by field, run a COUNT aggregate,
-- then close the handle.
-- Run: bin/calog examples/scripts/libraries/database.lua

local db = dbOpen("sqlite", ":memory:")

dbExec(db, "CREATE TABLE fruit (id INTEGER PRIMARY KEY, name TEXT, qty INTEGER, price REAL)")

-- Insert rows with bound parameters. dbExec returns rows affected.
local stock = {
  { "apple",  12, 0.35 },
  { "banana", 30, 0.20 },
  { "cherry",  8, 1.10 },
  { "date",   15, 0.75 },
}

local inserted = 0
for _, item in ipairs(stock) do
  inserted = inserted + dbExec(db, "INSERT INTO fruit (name, qty, price) VALUES (?, ?, ?)", item[1], item[2], item[3])
end
calogPrint("rows inserted:", inserted)

-- SELECT returning a list of row maps. Print each field explicitly.
local rows = dbQuery(db, "SELECT id, name, qty, price FROM fruit WHERE qty >= ? ORDER BY name", 10)
calogPrint("rows with qty >= 10:", #rows)
for _, row in ipairs(rows) do
  calogPrint(string.format("  #%d %-7s qty=%d price=%.2f", row.id, row.name, row.qty, row.price))
end

-- Aggregate query: COUNT and SUM in a single row.
local summary = dbQuery(db, "SELECT COUNT(*) AS n, SUM(qty) AS total FROM fruit")
calogPrint("distinct fruits:", summary[1].n)
calogPrint("total quantity:", summary[1].total)

dbClose(db)

calogExit(0)
