mirror of
https://github.com/go-gitea/gitea.git
synced 2026-08-03 18:24:29 +00:00
fff32e9469
Migrations should never use model structs directly, because the model structs can be different in different releases. e.g. if one migration uses "User" model, it works in the early releases, then one day, when the User model changes, the migration breaks because it will use the new (incorrect) User model, it should only use the old User model. The same to "modules/structs". --------- Signed-off-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: delvh <dev.lh@web.de>
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package v1_27
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"gitea.dev/modelmigration/base"
|
|
|
|
"xorm.io/xorm/schemas"
|
|
)
|
|
|
|
type issueWithLongTextContent struct {
|
|
Content string `xorm:"LONGTEXT"`
|
|
}
|
|
|
|
func (issueWithLongTextContent) TableName() string {
|
|
return "issue"
|
|
}
|
|
|
|
type commentWithLongTextFields struct {
|
|
Content string `xorm:"LONGTEXT"`
|
|
PatchQuoted string `xorm:"LONGTEXT patch"`
|
|
}
|
|
|
|
func (commentWithLongTextFields) TableName() string {
|
|
return "comment"
|
|
}
|
|
|
|
func isMSSQLMaxTextColumn(column *schemas.Column) bool {
|
|
if column.Length != -1 {
|
|
return false
|
|
}
|
|
return strings.EqualFold(column.SQLType.Name, schemas.Varchar) || strings.EqualFold(column.SQLType.Name, schemas.NVarchar)
|
|
}
|
|
|
|
func modifyLongTextColumnsForMSSQL(x base.EngineMigration, bean any, columnNames ...string) error {
|
|
table, err := x.TableInfo(bean)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, columnName := range columnNames {
|
|
column := table.GetColumn(columnName)
|
|
if column == nil {
|
|
return fmt.Errorf("column %s does not exist in table %s", columnName, table.Name)
|
|
}
|
|
if isMSSQLMaxTextColumn(column) {
|
|
continue
|
|
}
|
|
if err := base.ModifyColumn(x, table.Name, column); err != nil {
|
|
return fmt.Errorf("modify %s.%s: %w", table.Name, columnName, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExpandIssueAndCommentLongTextFieldsForMSSQL expands legacy MSSQL nvarchar(4000)
|
|
// columns to nvarchar(max) so PR push comments and long issue content are not truncated.
|
|
func ExpandIssueAndCommentLongTextFieldsForMSSQL(x base.EngineMigration) error {
|
|
if x.Dialect().URI().DBType != schemas.MSSQL {
|
|
return nil
|
|
}
|
|
|
|
if err := modifyLongTextColumnsForMSSQL(x, new(issueWithLongTextContent), "content"); err != nil {
|
|
return err
|
|
}
|
|
return modifyLongTextColumnsForMSSQL(x, new(commentWithLongTextFields), "content", "patch")
|
|
}
|