maptile/store/store.go

91 lines
1.6 KiB
Go
Executable File

package store
import (
"context"
"embed"
"time"
"git.zhouxhere.com/zhouxhere/maptile/util/maptool"
"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
Tile *maptool.TileReader
// MBTiles map[string]*mbtile.MBTile
// pmtiles map[string]*PMTiles
}
func NewStore(dsn string) (*Store, error) {
db, err := sqlx.Connect("postgres", dsn)
if err != nil {
return nil, err
}
// mbtiles, err := mbtile.ReadMBTiles()
tileReader, err := maptool.NewTileReader(1000, 2*time.Hour, "mbtiles", "pmtiles")
if err != nil {
return nil, err
}
return &Store{
dsn: dsn,
DB: db,
Tile: tileReader,
// MBTiles: mbtiles,
}, nil
}
func (s *Store) Close() error {
// for _, mbtile := range s.MBTiles {
// if err := mbtile.Close(); err != nil {
// return err
// }
// }
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
}