cic-custodial/pkg/postgres/pool.go

57 lines
1.1 KiB
Go
Raw Permalink Normal View History

2022-11-30 10:51:24 +01:00
package postgres
import (
"context"
"os"
2022-11-30 10:51:24 +01:00
"time"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/jackc/tern/v2/migrate"
)
const (
schemaTable = "schema_version"
2022-11-30 10:51:24 +01:00
)
type PostgresPoolOpts struct {
DSN string
MigrationsFolderPath string
2022-11-30 10:51:24 +01:00
}
2023-02-17 09:43:20 +01:00
// NewPostgresPool creates a reusbale connection pool across the cic-custodial component.
func NewPostgresPool(ctx context.Context, o PostgresPoolOpts) (*pgxpool.Pool, error) {
2022-11-30 10:51:24 +01:00
parsedConfig, err := pgxpool.ParseConfig(o.DSN)
if err != nil {
return nil, err
}
dbPool, err := pgxpool.NewWithConfig(ctx, parsedConfig)
2022-11-30 10:51:24 +01:00
if err != nil {
return nil, err
}
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
2022-11-30 10:51:24 +01:00
defer cancel()
conn, err := dbPool.Acquire(ctx)
if err != nil {
return nil, err
}
defer conn.Release()
migrator, err := migrate.NewMigrator(ctx, conn.Conn(), schemaTable)
if err != nil {
return nil, err
}
if err := migrator.LoadMigrations(os.DirFS(o.MigrationsFolderPath)); err != nil {
return nil, err
}
if err := migrator.Migrate(ctx); err != nil {
2022-11-30 10:51:24 +01:00
return nil, err
}
return dbPool, nil
}