67 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package migration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"log"
							 | 
						||
| 
								 | 
							
									"path/filepath"
							 | 
						||
| 
								 | 
							
									"sort"
							 | 
						||
| 
								 | 
							
									"sync"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"gorm.io/gorm"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Migrate = &Migration{
							 | 
						||
| 
								 | 
							
									version: make(map[string]func(db *gorm.DB, version string) error),
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Migration struct {
							 | 
						||
| 
								 | 
							
									db      *gorm.DB
							 | 
						||
| 
								 | 
							
									version map[string]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 string, 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([]string, 0)
							 | 
						||
| 
								 | 
							
									for k := range e.version {
							 | 
						||
| 
								 | 
							
										versions = append(versions, k)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if !sort.StringsAreSorted(versions) {
							 | 
						||
| 
								 | 
							
										sort.Strings(versions)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									var err error
							 | 
						||
| 
								 | 
							
									var count int64
							 | 
						||
| 
								 | 
							
									for _, v := range versions {
							 | 
						||
| 
								 | 
							
										err = e.db.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(), v)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											log.Fatalln(err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func GetFilename(s string) string {
							 | 
						||
| 
								 | 
							
									s = filepath.Base(s)
							 | 
						||
| 
								 | 
							
									return s[:13]
							 | 
						||
| 
								 | 
							
								}
							 |