41 lines
795 B
Go
41 lines
795 B
Go
package persistence
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
"allaboutapps.dev/aw/go-starter/internal/config"
|
|
)
|
|
|
|
const (
|
|
dbPingTimeout = 10 * time.Second
|
|
)
|
|
|
|
func NewDB(cfg config.Database) (*sql.DB, error) {
|
|
db, err := sql.Open("postgres", cfg.ConnectionString())
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to open db connection: %w", err)
|
|
}
|
|
|
|
if cfg.MaxOpenConns > 0 {
|
|
db.SetMaxOpenConns(cfg.MaxOpenConns)
|
|
}
|
|
if cfg.MaxIdleConns > 0 {
|
|
db.SetMaxIdleConns(cfg.MaxIdleConns)
|
|
}
|
|
if cfg.ConnMaxLifetime > 0 {
|
|
db.SetConnMaxLifetime(cfg.ConnMaxLifetime)
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), dbPingTimeout)
|
|
defer cancel()
|
|
|
|
if err := db.PingContext(ctx); err != nil {
|
|
return nil, fmt.Errorf("failed to ping DB: %w", err)
|
|
}
|
|
|
|
return db, nil
|
|
}
|