update to support postgresql and add godocs
Some checks failed
continuous-integration/drone Build is passing
CI / Lint (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / End-to-End (push) Has been cancelled
CI / Publish Docker (push) Has been cancelled

This commit is contained in:
2026-01-13 17:05:14 +11:00
parent afec4aacb0
commit ea1eeb5c21
37 changed files with 618 additions and 38 deletions

View File

@@ -3,46 +3,79 @@ package db
import (
"database/sql"
"embed"
"fmt"
"log/slog"
"reflect"
"vctp/db/queries"
"strings"
"github.com/jmoiron/sqlx"
"github.com/pressly/goose/v3"
)
//go:embed migrations/*.sql
//go:embed migrations migrations_postgres
var migrations embed.FS
type Database interface {
DB() *sqlx.DB
Queries() *queries.Queries
Queries() Querier
Logger() *slog.Logger
Close() error
}
func New(logger *slog.Logger, url string) (Database, error) {
db, err := newLocalDB(logger, url)
if err != nil {
return nil, err
}
if err = db.db.Ping(); err != nil {
return nil, err
}
return db, nil
type Config struct {
Driver string
DSN string
}
// Migrate runs the migrations on the database. Assumes the database is SQLite.
func Migrate(db Database) error {
func New(logger *slog.Logger, cfg Config) (Database, error) {
driver := normalizeDriver(cfg.Driver)
switch driver {
case "sqlite":
db, err := newLocalDB(logger, cfg.DSN)
if err != nil {
return nil, err
}
if err = db.db.Ping(); err != nil {
return nil, err
}
return db, nil
case "postgres":
db, err := newPostgresDB(logger, cfg.DSN)
if err != nil {
return nil, err
}
if err = db.db.Ping(); err != nil {
return nil, err
}
return db, nil
default:
return nil, fmt.Errorf("unsupported database driver: %s", cfg.Driver)
}
}
// Migrate runs the migrations on the database.
func Migrate(db Database, driver string) error {
driver = normalizeDriver(driver)
goose.SetBaseFS(migrations)
if err := goose.SetDialect("sqlite3"); err != nil {
panic(err)
}
if err := goose.Up(db.DB().DB, "migrations"); err != nil {
panic(err)
switch driver {
case "sqlite":
if err := goose.SetDialect("sqlite3"); err != nil {
return fmt.Errorf("failed to set sqlite dialect: %w", err)
}
if err := goose.Up(db.DB().DB, "migrations"); err != nil {
return fmt.Errorf("failed to run sqlite migrations: %w", err)
}
case "postgres":
if err := goose.SetDialect("postgres"); err != nil {
return fmt.Errorf("failed to set postgres dialect: %w", err)
}
if err := goose.Up(db.DB().DB, "migrations_postgres"); err != nil {
return fmt.Errorf("failed to run postgres migrations: %w", err)
}
default:
return fmt.Errorf("unsupported database driver: %s", driver)
}
// TODO - replace with goose
@@ -69,6 +102,18 @@ func Migrate(db Database) error {
return nil
}
func normalizeDriver(driver string) string {
normalized := strings.ToLower(strings.TrimSpace(driver))
switch normalized {
case "", "sqlite3":
return "sqlite"
case "postgresql":
return "postgres"
default:
return normalized
}
}
// ConvertToSQLParams is a utility function that generically converts a struct to a corresponding sqlc-generated struct
func ConvertToSQLParams(input interface{}, output interface{}) {
inputVal := reflect.ValueOf(input).Elem()