52 lines
974 B
Go
52 lines
974 B
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
func Connect(ctx context.Context) (*pgxpool.Pool, error) {
|
|
dsn := fmt.Sprintf(
|
|
"postgres://%s:%s@%s:%s/%s?sslmode=disable",
|
|
getEnv("DB_USER", "shop"),
|
|
getEnv("DB_PASSWORD", "shop_secret"),
|
|
getEnv("DB_HOST", "localhost"),
|
|
getEnv("DB_PORT", "5432"),
|
|
getEnv("DB_NAME", "shop"),
|
|
)
|
|
|
|
cfg, err := pgxpool.ParseConfig(dsn)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("parse config: %w", err)
|
|
}
|
|
|
|
cfg.MaxConns = 10
|
|
cfg.MinConns = 2
|
|
cfg.MaxConnLifetime = time.Hour
|
|
|
|
pool, err := pgxpool.NewWithConfig(ctx, cfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("connect: %w", err)
|
|
}
|
|
|
|
for i := 0; i < 30; i++ {
|
|
if err := pool.Ping(ctx); err == nil {
|
|
return pool, nil
|
|
}
|
|
time.Sleep(time.Second)
|
|
}
|
|
|
|
return nil, fmt.Errorf("database not ready after 30s")
|
|
}
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|