package goblocks import ( "context" "log/slog" "sync" _ "github.com/jackc/pgconn" _ "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" _ "github.com/jackc/pgx/v5/stdlib" ) var ( pgxPools = make(map[string]*pgxpool.Pool) pgxMutex sync.RWMutex ) func (a *App) NewPGXPool(name string) *pgxpool.Pool { pgxMutex.Lock() defer pgxMutex.Unlock() if pool, exists := pgxPools[name]; exists { return pool } dbPool, err := pgxpool.New(context.Background(), a.Datasource(name)) if err != nil { slog.Error("error connecting to database", "error", err, "name", name) panic(err) } if err := dbPool.Ping(context.Background()); err != nil { slog.Error("error pinging database, maybe incorrect datasource", "error", err, "name", name) panic(err) } pgxPools[name] = dbPool slog.Info("connected to database", "name", name) return dbPool } func (a *App) GetPGXPool(name string) (*pgxpool.Pool, bool) { pgxMutex.RLock() defer pgxMutex.RUnlock() pool, exists := pgxPools[name] return pool, exists } func (a *App) ClosePGXPools() { pgxMutex.Lock() defer pgxMutex.Unlock() for name, pool := range pgxPools { pool.Close() delete(pgxPools, name) slog.Info("closed database connection", "name", name) } }