Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-06-24 17:30:21 +03:00
parent a972565859
commit a56a0a8b21
3 changed files with 111 additions and 15 deletions

View File

@@ -13,25 +13,29 @@ import (
var PgDB *sql.DB
// ConnectPostgres PostgreSQL veritabanına bağlanır.
// ConnectPostgres PostgreSQL veritabanına bağlanır.
func ConnectPostgres() (*sql.DB, error) {
connStr := strings.TrimSpace(os.Getenv("POSTGRES_CONN"))
if connStr == "" {
return nil, fmt.Errorf("POSTGRES_CONN tanımlı değil")
return nil, fmt.Errorf("POSTGRES_CONN tanımlı değil")
}
// Make DB writes attributable in Postgres audit triggers via current_setting('application_name').
// Prefer setting it in POSTGRES_CONN, but default it here if missing.
connStr = ensurePGApplicationName(connStr, strings.TrimSpace(os.Getenv("POSTGRES_APPLICATION_NAME")))
db, err := sql.Open("postgres", connStr)
if err != nil {
return nil, fmt.Errorf("PostgreSQL bağlantı hatası: %w", err)
return nil, fmt.Errorf("PostgreSQL bağlantı hatası: %w", err)
}
// Bağlantı havuzu ayarları (audit log uyumlu).
// Bağlantı havuzu ayarları (audit log uyumlu).
db.SetMaxOpenConns(30)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(30 * time.Minute)
db.SetConnMaxIdleTime(5 * time.Minute)
// Bağlantıyı test et.
// Bağlantıyı test et.
if err = db.Ping(); err != nil {
// Some managed PostgreSQL servers require TLS. If the current DSN uses
// sslmode=disable and server rejects with "no encryption", retry once
@@ -40,6 +44,7 @@ func ConnectPostgres() (*sql.DB, error) {
strings.Contains(err.Error(), "no encryption") &&
strings.Contains(strings.ToLower(connStr), "sslmode=disable") {
secureConnStr := strings.Replace(connStr, "sslmode=disable", "sslmode=require", 1)
secureConnStr = ensurePGApplicationName(secureConnStr, strings.TrimSpace(os.Getenv("POSTGRES_APPLICATION_NAME")))
log.Println("PostgreSQL TLS gerektiriyor, sslmode=require ile tekrar deneniyor")
_ = db.Close()
@@ -54,28 +59,50 @@ func ConnectPostgres() (*sql.DB, error) {
db.SetConnMaxIdleTime(5 * time.Minute)
if err = db.Ping(); err != nil {
return nil, fmt.Errorf("PostgreSQL erişilemiyor (TLS retry): %w", err)
return nil, fmt.Errorf("PostgreSQL eriÅŸilemiyor (TLS retry): %w", err)
}
} else {
return nil, fmt.Errorf("PostgreSQL erişilemiyor: %w", err)
return nil, fmt.Errorf("PostgreSQL eriÅŸilemiyor: %w", err)
}
}
log.Println("PostgreSQL bağlantısı başarılı")
log.Println("PostgreSQL bağlantısı başarılı")
PgDB = db
return db, nil
}
// GetPostgresUsers test amaçlı ilk 5 kullanıcıyı listeler.
func ensurePGApplicationName(connStr string, appName string) string {
if strings.TrimSpace(appName) == "" {
appName = "bssapp-backend"
}
low := strings.ToLower(connStr)
if strings.Contains(low, "application_name=") {
return connStr
}
// URL style DSN: postgres://...?... (lib/pq supports it)
if strings.HasPrefix(low, "postgres://") || strings.HasPrefix(low, "postgresql://") {
sep := "?"
if strings.Contains(connStr, "?") {
sep = "&"
}
return connStr + sep + "application_name=" + appName
}
// Keyword DSN: "host=... user=... dbname=... sslmode=..."
return strings.TrimSpace(connStr) + " application_name=" + appName
}
// GetPostgresUsers test amaçlı ilk 5 kullanıcıyı listeler.
func GetPostgresUsers(db *sql.DB) error {
query := `SELECT id, code, email FROM mk_dfusr ORDER BY id LIMIT 5`
rows, err := db.Query(query)
if err != nil {
return fmt.Errorf("PostgreSQL sorgu hatası: %w", err)
return fmt.Errorf("PostgreSQL sorgu hatası: %w", err)
}
defer rows.Close()
fmt.Println("İlk 5 PostgreSQL kullanıcısı:")
fmt.Println("İlk 5 PostgreSQL kullanıcısı:")
for rows.Next() {
var id int
var code, email string