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