1// Copyright 2021 The Gitea Authors. All rights reserved. 2// Use of this source code is governed by a MIT-style 3// license that can be found in the LICENSE file. 4 5package migrations 6 7import ( 8 "context" 9 "fmt" 10 11 "code.gitea.io/gitea/modules/setting" 12 13 "xorm.io/xorm" 14) 15 16func renameTaskErrorsToMessage(x *xorm.Engine) error { 17 type Task struct { 18 Errors string `xorm:"TEXT"` // if task failed, saved the error reason 19 Type int 20 Status int `xorm:"index"` 21 } 22 23 // This migration maybe rerun so that we should check if it has been run 24 messageExist, err := x.Dialect().IsColumnExist(x.DB(), context.Background(), "task", "message") 25 if err != nil { 26 return err 27 } 28 29 if messageExist { 30 errorsExist, err := x.Dialect().IsColumnExist(x.DB(), context.Background(), "task", "errors") 31 if err != nil { 32 return err 33 } 34 if !errorsExist { 35 return nil 36 } 37 } 38 39 sess := x.NewSession() 40 defer sess.Close() 41 if err := sess.Begin(); err != nil { 42 return err 43 } 44 45 if err := sess.Sync2(new(Task)); err != nil { 46 return fmt.Errorf("error on Sync2: %v", err) 47 } 48 49 if messageExist { 50 // if both errors and message exist, drop message at first 51 if err := dropTableColumns(sess, "task", "message"); err != nil { 52 return err 53 } 54 } 55 56 switch { 57 case setting.Database.UseMySQL: 58 if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil { 59 return err 60 } 61 case setting.Database.UseMSSQL: 62 if _, err := sess.Exec("sp_rename 'task.errors', 'message', 'COLUMN'"); err != nil { 63 return err 64 } 65 default: 66 if _, err := sess.Exec("ALTER TABLE `task` RENAME COLUMN errors TO message"); err != nil { 67 return err 68 } 69 } 70 return sess.Commit() 71} 72