68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
|
package migration
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/spf13/cast"
|
||
|
"gorm.io/gorm"
|
||
|
"log"
|
||
|
"path/filepath"
|
||
|
"sort"
|
||
|
"strconv"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
var Migrate = &Migration{
|
||
|
version: make(map[int]func(db *gorm.DB, version string) error),
|
||
|
}
|
||
|
|
||
|
type Migration struct {
|
||
|
db *gorm.DB
|
||
|
version map[int]func(db *gorm.DB, version string) error
|
||
|
mutex sync.Mutex
|
||
|
}
|
||
|
|
||
|
func (e *Migration) GetDb() *gorm.DB {
|
||
|
return e.db
|
||
|
}
|
||
|
|
||
|
func (e *Migration) SetDb(db *gorm.DB) {
|
||
|
e.db = db
|
||
|
}
|
||
|
|
||
|
func (e *Migration) SetVersion(k int, f func(db *gorm.DB, version string) error) {
|
||
|
e.mutex.Lock()
|
||
|
defer e.mutex.Unlock()
|
||
|
e.version[k] = f
|
||
|
}
|
||
|
|
||
|
func (e *Migration) Migrate() {
|
||
|
versions := make([]int, 0)
|
||
|
for k := range e.version {
|
||
|
versions = append(versions, k)
|
||
|
}
|
||
|
sort.IntsAreSorted(versions)
|
||
|
var err error
|
||
|
var count int64
|
||
|
for _, v := range versions {
|
||
|
fmt.Println(v)
|
||
|
err = e.db.Debug().Table("sys_migration").Where("version = ?", v).Count(&count).Error
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
if count > 0 {
|
||
|
log.Println(count)
|
||
|
count = 0
|
||
|
continue
|
||
|
}
|
||
|
err = (e.version[v])(e.db.Debug(), strconv.Itoa(v))
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func GetFilename(s string) int {
|
||
|
s = filepath.Base(s)
|
||
|
return cast.ToInt(s[:13])
|
||
|
}
|