Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user