From 2ba8cb67c8e818cfee8863e29d9f9e111c26f301 Mon Sep 17 00:00:00 2001 From: ouqiang Date: Tue, 5 Sep 2017 14:11:18 +0800 Subject: [PATCH] =?UTF-8?q?feat($upgrade):=20=E6=94=AF=E6=8C=81=E4=BB=8Ev1?= =?UTF-8?q?.0=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7=E5=88=B0v1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/web.go | 6 ++- models/migration.go | 81 +++++++++++++++++++++++++++++++++-- modules/app/app.go | 6 +-- templates/host/host_form.html | 5 ++- templates/task/task_form.html | 4 +- 5 files changed, 89 insertions(+), 13 deletions(-) diff --git a/cmd/web.go b/cmd/web.go index 3aca1be..0f57d91 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -173,9 +173,13 @@ func shutdown() { grpcpool.Pool.ReleaseAll() } -// 判断应用是否需要升级, 当版本号文件版本小于app.VersionId时升级 +// 判断应用是否需要升级, 当存在版本号文件且版本小于app.VersionId时升级 func upgradeIfNeed() { currentVersionId := app.GetCurrentVersionId() + // 没有版本号文件 + if currentVersionId == 0 { + return; + } if currentVersionId >= app.VersionId { return } diff --git a/models/migration.go b/models/migration.go index 41c5b7d..ee186ea 100644 --- a/models/migration.go +++ b/models/migration.go @@ -2,6 +2,10 @@ package models import ( "errors" + "fmt" + "github.com/ouqiang/gocron/modules/logger" + "github.com/go-xorm/xorm" + "strconv" ) @@ -45,10 +49,14 @@ func isDatabaseExist(name string) bool { // 迭代升级数据库, 新建表、新增字段等 func (migration *Migration) Upgrade(oldVersionId int) { - versionIds := []int{} - upgradeFuncs := []func(){} + versionIds := []int{110} + upgradeFuncs := []func(*xorm.Session) error { + migration.upgradeFor110, + } + // 默认当前版本为v1.0 startIndex := 0 + // 从当前版本的下一版本开始升级 for i, value := range versionIds { if oldVersionId == value { startIndex = i + 1 @@ -57,8 +65,73 @@ func (migration *Migration) Upgrade(oldVersionId int) { } length := len(versionIds) + if startIndex >= length { + return + } + + session := Db.NewSession() + err := session.Begin() + if err != nil { + logger.Fatalf("开启事务失败-%s", err.Error()) + } for startIndex < length { - upgradeFuncs[startIndex]() - startIndex++ + err = upgradeFuncs[startIndex](session) + if err == nil { + startIndex++ + continue + } + dbErr := session.Rollback() + if dbErr != nil { + logger.Fatalf("事务回滚失败-%s",dbErr.Error()) + } + logger.Fatal(err) + } + err = session.Commit() + if err != nil { + logger.Fatalf("提交事务失败-%s", err.Error()) } } + +// 升级到v1.1版本 +func (migration *Migration) upgradeFor110(session *xorm.Session) error { + logger.Info("开始升级到v1.1") + // 创建表task_host + err := session.Sync2(new(TaskHost)) + if err != nil { + return err + } + + tableName := TablePrefix + "task" + // 把task对应的host_id写入task_host表 + sql := fmt.Sprintf("SELECT id, host_id FROM %s WHERE host_id > 0", tableName) + results, err := session.Query(sql) + if err != nil { + return err + } + + for _, value := range results { + taskHostModel := &TaskHost{} + taskId, err := strconv.Atoi(string(value["id"])) + if err != nil { + return err + } + hostId, err := strconv.Atoi(string(value["host_id"])) + if err != nil { + return err + } + taskHostModel.TaskId = taskId + taskHostModel.HostId = int16(hostId) + _, err = session.Insert(taskHostModel) + if err != nil { + return err + } + } + + + // 删除task表host_id字段 + _, err = session.Exec(fmt.Sprintf("ALTER TABLE %s DROP COLUMN host_id", tableName)) + + logger.Info("已升级到v1.1\n") + + return err +} diff --git a/modules/app/app.go b/modules/app/app.go index 1ee112d..262be05 100644 --- a/modules/app/app.go +++ b/modules/app/app.go @@ -76,8 +76,7 @@ func UpdateVersionFile() { // 获取应用当前版本号, 从版本号文件中读取 func GetCurrentVersionId() int { if !utils.FileExist(VersionFile) { - // 默认版本号110, 从v1.1版本开始支持升级 - return 110; + return 0; } bytes, err := ioutil.ReadFile(VersionFile) @@ -85,7 +84,7 @@ func GetCurrentVersionId() int { logger.Fatal(err) } - versionId, err := strconv.Atoi(string(bytes)) + versionId, err := strconv.Atoi(strings.TrimSpace(string(bytes))) if err != nil { logger.Fatal(err) } @@ -95,7 +94,6 @@ func GetCurrentVersionId() int { // 把字符串版本号a.b.c转换为整数版本号abc func ToNumberVersion(versionString string) int { - versionString = strings.TrimSpace(versionString) v := strings.Replace(versionString, ".", "", -1) if len(v) < 3 { v += "0" diff --git a/templates/host/host_form.html b/templates/host/host_form.html index d96dbf4..16edf9d 100644 --- a/templates/host/host_form.html +++ b/templates/host/host_form.html @@ -19,7 +19,7 @@
- +
@@ -31,7 +31,8 @@
- +
diff --git a/templates/task/task_form.html b/templates/task/task_form.html index 0178e38..1752c1c 100644 --- a/templates/task/task_form.html +++ b/templates/task/task_form.html @@ -19,7 +19,7 @@
任务名称
- +
@@ -151,7 +151,7 @@
- +
保存
取消