72 lines
1.1 KiB
Go
72 lines
1.1 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"embed"
|
|
|
|
"github.com/golang-migrate/migrate/v4"
|
|
_ "github.com/golang-migrate/migrate/v4/database/postgres"
|
|
"github.com/golang-migrate/migrate/v4/source/iofs"
|
|
"github.com/jmoiron/sqlx"
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
//go:embed migrations/*.sql
|
|
var sqlMigrations embed.FS
|
|
|
|
type Store struct {
|
|
dsn string
|
|
DB *sqlx.DB
|
|
}
|
|
|
|
func NewStore(dsn string) (*Store, error) {
|
|
db, err := sqlx.Connect("postgres", dsn)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Store{
|
|
dsn: dsn,
|
|
DB: db,
|
|
}, nil
|
|
}
|
|
|
|
func (s *Store) Close() error {
|
|
return s.DB.Close()
|
|
}
|
|
|
|
func (s *Store) Migrate(ctx context.Context) error {
|
|
source, err := iofs.New(sqlMigrations, "migrations")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
m, err := migrate.NewWithSourceInstance("iofs", source, s.dsn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceVersion, err := source.First()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
version, dirty, err := m.Version()
|
|
|
|
if err != nil && err != migrate.ErrNilVersion {
|
|
return err
|
|
}
|
|
|
|
if version == sourceVersion && !dirty {
|
|
return nil
|
|
}
|
|
|
|
if err = m.Up(); err != nil && err != migrate.ErrNoChange {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|