code.gitea.io/gitea@v1.22.3/models/migrations/v1_22/v283.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package v1_22 //nolint
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"xorm.io/xorm"
    10  	"xorm.io/xorm/schemas"
    11  )
    12  
    13  func AddCombinedIndexToIssueUser(x *xorm.Engine) error {
    14  	type OldIssueUser struct {
    15  		IssueID int64
    16  		UID     int64
    17  		Cnt     int64
    18  	}
    19  
    20  	var duplicatedIssueUsers []OldIssueUser
    21  	if err := x.SQL("select * from (select issue_id, uid, count(1) as cnt from issue_user group by issue_id, uid) a where a.cnt > 1").
    22  		Find(&duplicatedIssueUsers); err != nil {
    23  		return err
    24  	}
    25  	for _, issueUser := range duplicatedIssueUsers {
    26  		if x.Dialect().URI().DBType == schemas.MSSQL {
    27  			if _, err := x.Exec(fmt.Sprintf("delete from issue_user where id in (SELECT top %d id FROM issue_user WHERE issue_id = ? and uid = ?)", issueUser.Cnt-1), issueUser.IssueID, issueUser.UID); err != nil {
    28  				return err
    29  			}
    30  		} else {
    31  			var ids []int64
    32  			if err := x.SQL("SELECT id FROM issue_user WHERE issue_id = ? and uid = ? limit ?", issueUser.IssueID, issueUser.UID, issueUser.Cnt-1).Find(&ids); err != nil {
    33  				return err
    34  			}
    35  			if _, err := x.Table("issue_user").In("id", ids).Delete(); err != nil {
    36  				return err
    37  			}
    38  		}
    39  	}
    40  
    41  	type IssueUser struct {
    42  		UID     int64 `xorm:"INDEX unique(uid_to_issue)"` // User ID.
    43  		IssueID int64 `xorm:"INDEX unique(uid_to_issue)"`
    44  	}
    45  
    46  	return x.Sync(&IssueUser{})
    47  }