gitea源码

v294.go 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_22
  4. import (
  5. "fmt"
  6. "xorm.io/xorm"
  7. "xorm.io/xorm/schemas"
  8. )
  9. // AddUniqueIndexForProjectIssue adds unique indexes for project issue table
  10. func AddUniqueIndexForProjectIssue(x *xorm.Engine) error {
  11. // remove possible duplicated records in table project_issue
  12. type result struct {
  13. IssueID int64
  14. ProjectID int64
  15. Cnt int
  16. }
  17. var results []result
  18. if err := x.Select("issue_id, project_id, count(*) as cnt").
  19. Table("project_issue").
  20. GroupBy("issue_id, project_id").
  21. Having("count(*) > 1").
  22. Find(&results); err != nil {
  23. return err
  24. }
  25. for _, r := range results {
  26. if x.Dialect().URI().DBType == schemas.MSSQL {
  27. if _, err := x.Exec(fmt.Sprintf("delete from project_issue where id in (SELECT top %d id FROM project_issue WHERE issue_id = ? and project_id = ?)", r.Cnt-1), r.IssueID, r.ProjectID); err != nil {
  28. return err
  29. }
  30. } else {
  31. var ids []int64
  32. if err := x.SQL("SELECT id FROM project_issue WHERE issue_id = ? and project_id = ? limit ?", r.IssueID, r.ProjectID, r.Cnt-1).Find(&ids); err != nil {
  33. return err
  34. }
  35. if _, err := x.Table("project_issue").In("id", ids).Delete(); err != nil {
  36. return err
  37. }
  38. }
  39. }
  40. // add unique index for project_issue table
  41. type ProjectIssue struct { //revive:disable-line:exported
  42. ID int64 `xorm:"pk autoincr"`
  43. IssueID int64 `xorm:"INDEX unique(s)"`
  44. ProjectID int64 `xorm:"INDEX unique(s)"`
  45. }
  46. return x.Sync(new(ProjectIssue))
  47. }