You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package ent
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
sharedpostgres "knowfoolery/backend/shared/infra/database/postgres"
|
|
)
|
|
|
|
// Client wraps the pgx pool used by repository implementations.
|
|
type Client struct {
|
|
Pool *pgxpool.Pool
|
|
}
|
|
|
|
// NewClient creates a persistence client and verifies connectivity.
|
|
func NewClient(ctx context.Context, cfg sharedpostgres.Config) (*Client, error) {
|
|
poolCfg, err := pgxpool.ParseConfig(cfg.URL())
|
|
if err != nil {
|
|
return nil, fmt.Errorf("parse postgres config: %w", err)
|
|
}
|
|
poolCfg.MaxConns = clampIntToInt32(cfg.MaxOpenConns)
|
|
poolCfg.MinConns = clampIntToInt32(cfg.MaxIdleConns)
|
|
poolCfg.MaxConnLifetime = cfg.ConnMaxLifetime
|
|
poolCfg.MaxConnIdleTime = cfg.ConnMaxIdleTime
|
|
|
|
pool, err := pgxpool.NewWithConfig(ctx, poolCfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("create postgres pool: %w", err)
|
|
}
|
|
|
|
if err := pool.Ping(ctx); err != nil {
|
|
pool.Close()
|
|
return nil, fmt.Errorf("ping postgres: %w", err)
|
|
}
|
|
|
|
return &Client{Pool: pool}, nil
|
|
}
|
|
|
|
// Close closes the underlying pool.
|
|
func (c *Client) Close() {
|
|
if c != nil && c.Pool != nil {
|
|
c.Pool.Close()
|
|
}
|
|
}
|
|
|
|
func clampIntToInt32(v int) int32 {
|
|
const maxInt32 = int(^uint32(0) >> 1)
|
|
if v <= 0 {
|
|
return 0
|
|
}
|
|
if v > maxInt32 {
|
|
return int32(maxInt32)
|
|
}
|
|
return int32(v)
|
|
}
|