Files
forge/models/migrations/v1_13/v145.go
zeekayandHanzo Dev aa87442fdd Record upstream authorship centrally in NOTICE instead of in every file header
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the
Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in
NOTICE, alongside LICENSE. The header lint accepts any copyright line above the
SPDX line, so it no longer demands an upstream one.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-10 17:50:35 -07:00

81 lines
2.4 KiB
Go

// Copyright 2026 Hanzo AI, Inc. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_13
import (
"fmt"
"github.com/hanzoai/git/models/db"
"github.com/hanzoai/git/modules/setting"
)
func IncreaseLanguageField(x db.EngineMigration) error {
type LanguageStat struct {
RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
Language string `xorm:"VARCHAR(50) UNIQUE(s) INDEX NOT NULL"`
}
if err := x.Sync(new(LanguageStat)); err != nil {
return err
}
if setting.Database.Type.IsSQLite3() {
// SQLite maps VARCHAR to TEXT without size so we're done
return nil
}
// need to get the correct type for the new column
inferredTable, err := x.TableInfo(new(LanguageStat))
if err != nil {
return err
}
column := inferredTable.GetColumn("language")
sqlType := x.Dialect().SQLType(column)
sess := x.NewSession()
defer sess.Close()
if err := sess.Begin(); err != nil {
return err
}
switch {
case setting.Database.Type.IsMySQL():
if _, err := sess.Exec("ALTER TABLE language_stat MODIFY COLUMN language " + sqlType); err != nil {
return err
}
case setting.Database.Type.IsMSSQL():
// Yet again MSSQL just has to be awkward.
// Here we have to drop the constraints first and then rebuild them
constraints := make([]string, 0)
if err := sess.SQL(`SELECT i.name AS Name
FROM sys.indexes i INNER JOIN sys.index_columns ic
ON i.index_id = ic.index_id AND i.object_id = ic.object_id
INNER JOIN sys.tables AS t
ON t.object_id = i.object_id
INNER JOIN sys.columns c
ON t.object_id = c.object_id AND ic.column_id = c.column_id
WHERE t.name = 'language_stat' AND c.name = 'language'`).Find(&constraints); err != nil {
return fmt.Errorf("Find constraints: %w", err)
}
for _, constraint := range constraints {
if _, err := sess.Exec(fmt.Sprintf("DROP INDEX [%s] ON `language_stat`", constraint)); err != nil {
return fmt.Errorf("Drop table `language_stat` constraint `%s`: %w", constraint, err)
}
}
if _, err := sess.Exec("ALTER TABLE language_stat ALTER COLUMN language " + sqlType); err != nil {
return err
}
// Finally restore the constraint
if err := sess.CreateUniques(new(LanguageStat)); err != nil {
return err
}
case setting.Database.Type.IsPostgreSQL():
if _, err := sess.Exec("ALTER TABLE language_stat ALTER COLUMN language TYPE " + sqlType); err != nil {
return err
}
}
return sess.Commit()
}