59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
// Package store owns the Postgres connection pool and migrations for the
|
|
// Control Center database.
|
|
package store
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
"github.com/jackc/pgx/v5/stdlib"
|
|
"github.com/pressly/goose/v3"
|
|
)
|
|
|
|
type Store struct {
|
|
Pool *pgxpool.Pool
|
|
}
|
|
|
|
func Connect(ctx context.Context, dsn string) (*Store, error) {
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("connect control-center db: %w", err)
|
|
}
|
|
if err := pool.Ping(ctx); err != nil {
|
|
pool.Close()
|
|
return nil, fmt.Errorf("ping control-center db: %w", err)
|
|
}
|
|
return &Store{Pool: pool}, nil
|
|
}
|
|
|
|
func (s *Store) Close() { s.Pool.Close() }
|
|
|
|
// Migrate applies goose migrations from dir.
|
|
func Migrate(ctx context.Context, dsn, dir string) error {
|
|
db := stdlib.OpenDBFromPool(mustPool(ctx, dsn))
|
|
defer db.Close()
|
|
return MigrateDB(db, dir)
|
|
}
|
|
|
|
// MigrateDB applies goose migrations on an existing *sql.DB.
|
|
func MigrateDB(db *sql.DB, dir string) error {
|
|
goose.SetBaseFS(nil)
|
|
if err := goose.SetDialect("postgres"); err != nil {
|
|
return err
|
|
}
|
|
if err := goose.Up(db, dir); err != nil {
|
|
return fmt.Errorf("goose up %s: %w", dir, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func mustPool(ctx context.Context, dsn string) *pgxpool.Pool {
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
panic(fmt.Errorf("connect for migrate: %w", err))
|
|
}
|
|
return pool
|
|
}
|