update to support postgresql and add godocs
This commit is contained in:
85
db/db.go
85
db/db.go
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user