maptile/store/store.go

72 lines
1.1 KiB
Go
Executable File

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
}