package main

import (
	"database/sql"
	"fmt"
	"net/url"
	"strings"
)

// parseDSN mengurai DSN bergaya URL PostgreSQL menjadi komponennya.
func parseDSN(dsn string) (map[string]string, error) {
	u, err := url.Parse(dsn)
	if err != nil {
		return nil, err
	}
	hasil := map[string]string{
		"host":   u.Hostname(),
		"port":   u.Port(),
		"dbname": strings.TrimPrefix(u.Path, "/"),
	}
	if u.User != nil {
		hasil["user"] = u.User.Username()
		if sandi, ok := u.User.Password(); ok {
			hasil["password"] = sandi
		}
	}
	hasil["sslmode"] = u.Query().Get("sslmode")
	return hasil, nil
}

func main() {
	dsn := "postgres://budi:YOUR_DATABASE_PASSWORD@db.example.com:5432/toko?sslmode=disable"

	bagian, err := parseDSN(dsn)
	if err != nil {
		fmt.Println("gagal mengurai DSN:", err)
		return
	}
	for _, k := range []string{"host", "port", "user", "password", "dbname", "sslmode"} {
		fmt.Printf("%s=%s\n", k, bagian[k])
	}

	// Nama driver "pgx" sengaja tidak didaftarkan (program ini tidak
	// memakai blank import driver) agar pesan error aslinya terlihat.
	db, err := sql.Open("pgx", dsn)
	fmt.Println("err dari sql.Open:", err)
	fmt.Println("db bernilai nil?:", db == nil)
}
