#!/usr/bin/env bash
# Reproduce RESERVED-lock conflict for SQLite kernel article 09.
# Environment: Linux/WSL2, sqlite3 3.45+ (recorded with 3.53.2).
# Two sqlite3 CLI processes against the same rollback-journal-mode database:
#   session A: BEGIN IMMEDIATE (acquire RESERVED), hold it via a FIFO-fed stdin.
#   session B: single-statement INSERT (implicit tx must also acquire RESERVED) and a SELECT.
set -euo pipefail
DIR="$(cd "$(dirname "$0")" && pwd)"
DB="$DIR/sk-lock.db"
FIFO="$DIR/sk-lock.fifo"
rm -f "$DB" "$DB"-* "$FIFO"
mkfifo "$FIFO"

sqlite3 "$DB" "CREATE TABLE t(id INTEGER PRIMARY KEY, name TEXT); INSERT INTO t(name) VALUES('seed');"

sqlite3 "$DB" < "$FIFO" > "$DIR/session_a.out" 2>&1 &
A_PID=$!
exec 3>"$FIFO"

echo "BEGIN IMMEDIATE;" >&3
sleep 0.5

echo "=== session B: write while A holds RESERVED ==="
sqlite3 "$DB" "INSERT INTO t(name) VALUES('from_b');" 2>&1 || true

echo "=== session B: read while A holds RESERVED ==="
sqlite3 "$DB" "SELECT * FROM t;"

echo "COMMIT;" >&3
sleep 0.3
exec 3>&-
wait "$A_PID" 2>/dev/null || true
rm -f "$FIFO"

echo "=== final table state ==="
sqlite3 "$DB" "SELECT * FROM t;"
