feat($upgrade): 支持从v1.0版本升级到v1.1

pull/21/merge
ouqiang 2017-09-05 14:11:18 +08:00
parent 350dc0881e
commit 2ba8cb67c8
5 changed files with 89 additions and 13 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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"

View File

@ -19,7 +19,7 @@
<div class="field">
<label></label>
<div class="ui small input">
<input type="text" name="name" value="{{{.Host.Name}}}" placeholder="192.168.50.154">
<input type="text" name="name" value="{{{.Host.Name}}}" placeholder="127.0.0.1">
</div>
</div>
<div class="field">
@ -31,7 +31,8 @@
<div class="field">
<label></label>
<div class="ui small input">
<input type="text" name="alias" value="{{{.Host.Alias}}}">
<input type="text" name="alias" value="{{{.Host.Alias}}}"
placeholder="节点名称如web">
</div>
</div>
</div>

View File

@ -19,7 +19,7 @@
<div class="content"></div>
</label>
<div class="ui small input">
<input type="text" name="name" placeholder="订单量统计" value="{{{.Task.Name}}}">
<input type="text" name="name" placeholder="任务名称" value="{{{.Task.Name}}}">
</div>
</div>
</div>
@ -151,7 +151,7 @@
<div class="two fields">
<div class="field">
<label></label>
<textarea rows="5" name="remark" placeholder="统计昨天的订单量">{{{.Task.Remark}}}</textarea>
<textarea rows="5" name="remark" placeholder="任务备注信息">{{{.Task.Remark}}}</textarea>
</div>
</div>
<div class="ui primary submit button"></div> <a class="ui button" onclick="location.href='/task';"></a>