修改SQL对比算法

This commit is contained in:
GoEdgeLab
2020-11-16 23:30:47 +08:00
parent 8f92d0c518
commit 7b7e5cf982
21 changed files with 588 additions and 1512 deletions

View File

@@ -3,21 +3,20 @@ package setup
import (
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/setup/sqls"
_ "github.com/go-sql-driver/mysql"
"github.com/go-yaml/yaml"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/lists"
"github.com/iwind/TeaGo/rands"
"github.com/iwind/TeaGo/types"
stringutil "github.com/iwind/TeaGo/utils/string"
"io/ioutil"
"sort"
"strings"
"time"
)
var LatestSQLResult = &SQLDumpResult{}
// 安装或升级SQL执行器
type SQLExecutor struct {
dbConfig *dbs.DBConfig
@@ -49,113 +48,12 @@ func (this *SQLExecutor) Run() error {
return err
}
tableNames, err := db.TableNames()
sqlDump := NewSQLDump()
_, err = sqlDump.Apply(db, LatestSQLResult)
if err != nil {
return err
}
// 检查已有数据
if lists.ContainsString(tableNames, "edgeVersions") {
stmt, err := db.Prepare("SELECT version FROM " + db.TablePrefix() + "Versions")
if err != nil {
return err
}
defer func() {
_ = stmt.Close()
}()
rows, err := stmt.Query()
if err != nil {
return err
}
defer func() {
_ = rows.Close()
}()
// 对比版本
oldVersion := ""
if rows.Next() {
err = rows.Scan(&oldVersion)
if err != nil {
return errors.New("query version failed: " + err.Error())
}
}
if oldVersion == teaconst.Version {
err = this.checkData(db)
if err != nil {
return err
}
return nil
}
oldVersion = strings.Replace(oldVersion, "_", ".", -1)
upgradeVersions := []string{}
sqlMap := map[string]string{} // version => sql
for _, m := range sqls.SQLVersions {
version, _ := m["version"]
if version == "full" {
continue
}
version = strings.Replace(version, "_", ".", -1)
if len(oldVersion) == 0 || stringutil.VersionCompare(version, oldVersion) > 0 {
upgradeVersions = append(upgradeVersions, version)
sql, _ := m["sql"]
sqlMap[version] = sql
}
}
// 如果没有可以升级的版本,直接返回
if len(upgradeVersions) == 0 {
err = this.checkData(db)
if err != nil {
return err
}
return nil
}
sort.Slice(upgradeVersions, func(i, j int) bool {
return stringutil.VersionCompare(upgradeVersions[i], upgradeVersions[j]) < 0
})
// 执行升级的SQL
for _, version := range upgradeVersions {
sql := sqlMap[version]
_, err = db.Exec(sql)
if err != nil {
if !this.canIgnoreError(err) {
return errors.New("exec upgrade sql for version '" + version + "' failed: " + err.Error())
}
}
err = this.updateVersion(db, version)
if err != nil {
return err
}
}
// 检查数据
err = this.checkData(db)
if err != nil {
return err
}
return nil
}
// 全新安装
fullSQL, found := this.findFullSQL()
if !found {
return errors.New("not found full setup sql")
}
// 执行SQL
_, err = db.Exec(fullSQL)
if err != nil {
return errors.New("create tables failed: " + err.Error())
}
// 检查数据
err = this.checkData(db)
if err != nil {
@@ -165,18 +63,6 @@ func (this *SQLExecutor) Run() error {
return nil
}
// 查找完整的SQL
func (this *SQLExecutor) findFullSQL() (sql string, found bool) {
for _, m := range sqls.SQLVersions {
code, _ := m["version"]
if code == "full" {
sql, found = m["sql"]
return
}
}
return
}
// 检查数据
func (this *SQLExecutor) checkData(db *dbs.DB) error {
// 检查管理员