hugo-cms/providers/db/provider.go
2025-01-27 21:48:40 +11:00

60 lines
1.1 KiB
Go

package db
import (
"context"
"errors"
"github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/pgx/v5"
"github.com/golang-migrate/migrate/v4/source/iofs"
"github.com/jackc/pgx/v5/pgxpool"
"lmika.dev/lmika/hugo-cms/gen/sqlc/dbq"
"lmika.dev/lmika/hugo-cms/sql"
"strings"
)
type DB struct {
url string
pool *pgxpool.Pool
q *dbq.Queries
}
func New(url string) (*DB, error) {
pool, err := pgxpool.New(context.Background(), url)
if err != nil {
return nil, err
}
return &DB{
url: url,
pool: pool,
q: dbq.New(pool),
}, nil
}
func (db *DB) Close() {
db.pool.Close()
}
func (db *DB) Ping(ctx context.Context) error {
return db.pool.Ping(ctx)
}
func (db *DB) Migrate(ctx context.Context) error {
ms, err := iofs.New(sql.FS, "schema")
if err != nil {
return err
}
dbURL := "pgx5://" + strings.TrimPrefix(db.url, "postgres://")
m, err := migrate.NewWithSourceInstance("iofs", ms, dbURL)
if err != nil {
return err
}
err = m.Up()
if err != nil && !errors.Is(err, migrate.ErrNoChange) {
return err
}
return nil
}