"""tangani.py — menangani error MySQL dari sisi aplikasi dengan PyMySQL.

Jalankan dari folder chapter:  python3 tangani.py
Port default 3306; timpa lewat variabel lingkungan DB_PORT.
"""

import os

import pymysql

port = int(os.environ.get("DB_PORT", "3306"))

print("== 1062: INSERT duplikat ==")
with pymysql.connect(
    host="127.0.0.1",
    user="root",
    password="",
    database="belajar_app",
    port=port,
) as koneksi:
    try:
        with koneksi.cursor() as kursor:
            kursor.execute(
                "INSERT INTO produk (id, nama, harga) VALUES (%s, %s, %s)",
                (1, "Kopi Duplikat", 99000),
            )
        koneksi.commit()
        print("Produk tersimpan.")
    except pymysql.err.IntegrityError as err:
        if err.args[0] == 1062:
            print("Produk dengan id 1 sudah ada; data lama tetap dipakai.")
        else:
            print("Penyimpanan gagal, kode error:", err.args[0])

print("== 1049: database tidak ada ==")
try:
    pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="",
        database="database_tidak_ada",
        port=port,
    )
except pymysql.err.OperationalError as err:
    print("Koneksi ditolak kode 1049: database tidak ditemukan, cek namanya.")

print("== 2003: server tidak merespons ==")
try:
    pymysql.connect(
        host="127.0.0.1",
        user="root",
        password="",
        database="belajar_app",
        port=3307,
        connect_timeout=2,
    )
except pymysql.err.OperationalError as err:
    print("Koneksi gagal kode 2003: server tidak terjangkau di port itu.")
