package workers import ( "context" "fmt" "os" "strconv" "time" "github.com/jackc/pgx/v5/pgxpool" ) var pool *pgxpool.Pool type Config struct { Host string Port int DBName string User string Password string } func LoadDBConfig() *Config { return &Config{ Host: getEnv("DB_HOST", "localhost"), Port: getEnvInt("DB_PORT", 5432), DBName: getEnv("DB_NAME", "rss"), User: getEnv("DB_USER", "rss"), Password: getEnv("DB_PASS", "rss"), } } func Connect(cfg *Config) error { dsn := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName) poolConfig, err := pgxpool.ParseConfig(dsn) if err != nil { return fmt.Errorf("failed to parse config: %w", err) } poolConfig.MaxConns = 25 poolConfig.MinConns = 5 poolConfig.MaxConnLifetime = time.Hour poolConfig.MaxConnIdleTime = 30 * time.Minute pool, err = pgxpool.NewWithConfig(context.Background(), poolConfig) if err != nil { return fmt.Errorf("failed to create pool: %w", err) } if err = pool.Ping(context.Background()); err != nil { return fmt.Errorf("failed to ping database: %w", err) } return nil } func GetPool() *pgxpool.Pool { return pool } func Close() { if pool != nil { pool.Close() } } func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } func getEnvInt(key string, defaultValue int) int { if value := os.Getenv(key); value != "" { if intVal, err := strconv.Atoi(value); err == nil { return intVal } } return defaultValue }