# Context manager koneksi psycopg: commit saat blok sukses,
# rollback saat blok error, koneksi ditutup saat blok selesai.
import psycopg

# Blok sukses: seluruh INSERT di dalamnya di-commit otomatis
# saat blok keluar tanpa error.
with psycopg.connect() as conn:
    conn.execute(
        "INSERT INTO item_pesanan VALUES (2, 101, 'Gula 1 kg', 1)")
    conn.execute(
        "INSERT INTO item_pesanan VALUES (3, 101, 'Kopi sachet', 12)")
    print("di dalam blok, koneksi masih terbuka:", not conn.closed)

with psycopg.connect() as cek:
    print("setelah blok sukses (auto-commit) :",
          cek.execute("SELECT count(*) FROM item_pesanan").fetchone()[0],
          "baris")

# Blok error: exception di tengah blok memicu rollback otomatis.
try:
    with psycopg.connect() as conn:
        conn.execute(
            "INSERT INTO item_pesanan VALUES (4, 102, 'Teh celup', 3)")
        raise RuntimeError("aplikasi gagal di tengah proses")
except RuntimeError as e:
    print("exception ditangkap:", e)

with psycopg.connect() as cek:
    print("setelah blok error (auto-rollback):",
          cek.execute("SELECT count(*) FROM item_pesanan").fetchone()[0],
          "baris")

# psycopg 3 menutup koneksinya saat blok selesai (berbeda dari
# psycopg 2 yang hanya commit/rollback tanpa menutup koneksi).
print("koneksi ditutup otomatis setelah blok:", conn.closed)
