Files
Agent-System/internal/controlcenter/store/store.go
T

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
}