#!/bin/bash
# Simulasi dua terminal: terminal A menjalankan DDL (ALTER TABLE) di dalam
# transaksi terbuka, terminal B mencoba membaca tabel yang sama dengan
# batas waktu tunggu lock_timeout.

: "${PGDATABASE:=latihan}"
export PGDATABASE

TMPD=$(mktemp -d)
mkfifo "$TMPD/komando.fifo"

# Terminal A: sesi psql yang tetap hidup, perintah dikirim lewat fifo
PGAPPNAME=terminal-a psql -X < "$TMPD/komando.fifo" > "$TMPD/a.log" 2>&1 &
SESIA=$!
exec 3>"$TMPD/komando.fifo"

printf 'BEGIN;\nALTER TABLE rekening ADD COLUMN catatan text;\n' >&3

# Tunggu sampai ALTER TABLE di A benar-benar berjalan (status idle in transaction)
for i in $(seq 1 100); do
  n=$(psql -X -tA -c "SELECT count(*) FROM pg_stat_activity
                      WHERE datname = current_database()
                        AND application_name = 'terminal-a'
                        AND state = 'idle in transaction'")
  [ "$n" = "1" ] && break
  sleep 0.05
done

# Terminal B: SELECT sederhana diblokir oleh ACCESS EXCLUSIVE milik A,
# lalu dibatalkan setelah lock_timeout terlampaui
PGAPPNAME=terminal-b psql -X \
  -c "SET lock_timeout = '2s'" \
  -c "SELECT count(*) FROM rekening;" \
  > "$TMPD/b.log" 2>&1

# Terminal A membatalkan transaksinya - kolom catatan ikut lenyap
printf 'ROLLBACK;\n' >&3
exec 3>&-
wait $SESIA

echo "== Terminal A: ALTER TABLE dalam transaksi terbuka =="
cat "$TMPD/a.log"
echo
echo "== Terminal B: SELECT diblokir, dibatalkan lock_timeout =="
cat "$TMPD/b.log"
echo
echo "== Struktur tabel setelah A rollback =="
psql -X -c "SELECT column_name, data_type FROM information_schema.columns
            WHERE table_name = 'rekening' ORDER BY ordinal_position;"

rm -rf "$TMPD"
