///|
/// The transaction bracket — `begin` / `commit` / `rollback` — delegated to the driver.
/// `@moondb.MockDriver` models it faithfully: `begin` snapshots the store, `rollback`
/// restores that snapshot, `commit` keeps the changes. So the row count is a real
/// witness — it climbs inside a transaction, drops back on rollback, and stays put on
/// commit. `in_transaction` reports whether a bracket is open.
///
///     moon run examples/14-transactions
#coverage.skip
fn main {
  try {
    let drv = @moondb.MockDriver::new()
    let sess = @moonorm.Session::new(drv)

    // A baseline row, outside any transaction.
    sess.add(@moonorm.insert("t").set("n", @moondb.Int(233))) |> ignore
    println(
      "start:          rows=\{drv.row_count()} in_tx=\{drv.in_transaction()}",
    )

    // Roll back: everything since begin() is discarded.
    sess.begin()
    sess.add(@moonorm.insert("t").set("n", @moondb.Int(23333))) |> ignore
    sess.add(@moonorm.insert("t").set("n", @moondb.Int(66666))) |> ignore
    println(
      "inside tx:      rows=\{drv.row_count()} in_tx=\{drv.in_transaction()}",
    )
    sess.rollback()
    println(
      "after rollback: rows=\{drv.row_count()} in_tx=\{drv.in_transaction()}",
    )

    // Commit: everything since begin() is kept.
    sess.begin()
    sess.add(@moonorm.insert("t").set("n", @moondb.Int(233))) |> ignore
    sess.commit()
    println(
      "after commit:   rows=\{drv.row_count()} in_tx=\{drv.in_transaction()}",
    )
    sess.close()
  } catch {
    e => println("db error: " + e.to_string())
  }
}