gitea源码

v145.go 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_13
  4. import (
  5. "fmt"
  6. "code.gitea.io/gitea/modules/setting"
  7. "xorm.io/xorm"
  8. )
  9. func IncreaseLanguageField(x *xorm.Engine) error {
  10. type LanguageStat struct {
  11. RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
  12. Language string `xorm:"VARCHAR(50) UNIQUE(s) INDEX NOT NULL"`
  13. }
  14. if err := x.Sync(new(LanguageStat)); err != nil {
  15. return err
  16. }
  17. if setting.Database.Type.IsSQLite3() {
  18. // SQLite maps VARCHAR to TEXT without size so we're done
  19. return nil
  20. }
  21. // need to get the correct type for the new column
  22. inferredTable, err := x.TableInfo(new(LanguageStat))
  23. if err != nil {
  24. return err
  25. }
  26. column := inferredTable.GetColumn("language")
  27. sqlType := x.Dialect().SQLType(column)
  28. sess := x.NewSession()
  29. defer sess.Close()
  30. if err := sess.Begin(); err != nil {
  31. return err
  32. }
  33. switch {
  34. case setting.Database.Type.IsMySQL():
  35. if _, err := sess.Exec("ALTER TABLE language_stat MODIFY COLUMN language " + sqlType); err != nil {
  36. return err
  37. }
  38. case setting.Database.Type.IsMSSQL():
  39. // Yet again MSSQL just has to be awkward.
  40. // Here we have to drop the constraints first and then rebuild them
  41. constraints := make([]string, 0)
  42. if err := sess.SQL(`SELECT i.name AS Name
  43. FROM sys.indexes i INNER JOIN sys.index_columns ic
  44. ON i.index_id = ic.index_id AND i.object_id = ic.object_id
  45. INNER JOIN sys.tables AS t
  46. ON t.object_id = i.object_id
  47. INNER JOIN sys.columns c
  48. ON t.object_id = c.object_id AND ic.column_id = c.column_id
  49. WHERE t.name = 'language_stat' AND c.name = 'language'`).Find(&constraints); err != nil {
  50. return fmt.Errorf("Find constraints: %w", err)
  51. }
  52. for _, constraint := range constraints {
  53. if _, err := sess.Exec(fmt.Sprintf("DROP INDEX [%s] ON `language_stat`", constraint)); err != nil {
  54. return fmt.Errorf("Drop table `language_stat` constraint `%s`: %w", constraint, err)
  55. }
  56. }
  57. if _, err := sess.Exec("ALTER TABLE language_stat ALTER COLUMN language " + sqlType); err != nil {
  58. return err
  59. }
  60. // Finally restore the constraint
  61. if err := sess.CreateUniques(new(LanguageStat)); err != nil {
  62. return err
  63. }
  64. case setting.Database.Type.IsPostgreSQL():
  65. if _, err := sess.Exec("ALTER TABLE language_stat ALTER COLUMN language TYPE " + sqlType); err != nil {
  66. return err
  67. }
  68. }
  69. return sess.Commit()
  70. }