2020-11-09 06:15:09 +00:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2020-11-09 06:15:09 +00:00
2022-11-02 16:54:36 +08:00
package v1_14 //nolint
2020-11-09 06:15:09 +00:00
import (
"fmt"
"strconv"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"xorm.io/xorm"
)
2022-11-02 16:54:36 +08:00
func UpdateCodeCommentReplies ( x * xorm . Engine ) error {
2020-11-09 06:15:09 +00:00
type Comment struct {
ID int64 ` xorm:"pk autoincr" `
CommitSHA string ` xorm:"VARCHAR(40)" `
Patch string ` xorm:"TEXT patch" `
Invalidated bool
// Not extracted but used in the below query
Type int ` xorm:"INDEX" `
Line int64 // - previous line / + proposed line
TreePath string
ReviewID int64 ` xorm:"index" `
}
2023-08-13 21:17:21 +02:00
if err := x . Sync ( new ( Comment ) ) ; err != nil {
2020-11-09 06:15:09 +00:00
return err
}
sqlSelect := ` SELECT comment.id as id, first.commit_sha as commit_sha, first.patch as patch, first.invalidated as invalidated `
sqlTail := ` FROM comment INNER JOIN (
SELECT C . id , C . review_id , C . line , C . tree_path , C . patch , C . commit_sha , C . invalidated
FROM comment AS C
WHERE C . type = 21
AND C . created_unix =
( SELECT MIN ( comment . created_unix )
FROM comment
WHERE comment . review_id = C . review_id
AND comment . type = 21
AND comment . line = C . line
AND comment . tree_path = C . tree_path )
) AS first
ON comment . review_id = first . review_id
AND comment . tree_path = first . tree_path AND comment . line = first . line
WHERE comment . type = 21
AND comment . id != first . id
AND comment . commit_sha != first . commit_sha `
2021-03-15 02:52:12 +08:00
var (
sqlCmd string
start = 0
batchSize = 100
sess = x . NewSession ( )
)
2020-11-09 06:15:09 +00:00
defer sess . Close ( )
for {
if err := sess . Begin ( ) ; err != nil {
return err
}
2023-03-07 18:51:06 +08:00
if setting . Database . Type . IsMSSQL ( ) {
2020-11-09 06:15:09 +00:00
if _ , err := sess . Exec ( sqlSelect + " INTO #temp_comments" + sqlTail ) ; err != nil {
log . Error ( "unable to create temporary table" )
return err
}
}
2021-03-15 02:52:12 +08:00
comments := make ( [ ] * Comment , 0 , batchSize )
2020-11-09 06:15:09 +00:00
switch {
2023-03-07 18:51:06 +08:00
case setting . Database . Type . IsMySQL ( ) :
2020-11-09 06:15:09 +00:00
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv . Itoa ( batchSize ) + ", " + strconv . Itoa ( start )
2023-03-07 18:51:06 +08:00
case setting . Database . Type . IsPostgreSQL ( ) :
2020-11-09 06:15:09 +00:00
fallthrough
2023-03-07 18:51:06 +08:00
case setting . Database . Type . IsSQLite3 ( ) :
2020-11-09 06:15:09 +00:00
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv . Itoa ( batchSize ) + " OFFSET " + strconv . Itoa ( start )
2023-03-07 18:51:06 +08:00
case setting . Database . Type . IsMSSQL ( ) :
2020-11-09 06:15:09 +00:00
sqlCmd = "SELECT TOP " + strconv . Itoa ( batchSize ) + " * FROM #temp_comments WHERE " +
"(id NOT IN ( SELECT TOP " + strconv . Itoa ( start ) + " id FROM #temp_comments ORDER BY id )) ORDER BY id"
default :
return fmt . Errorf ( "Unsupported database type" )
}
if err := sess . SQL ( sqlCmd ) . Find ( & comments ) ; err != nil {
log . Error ( "failed to select: %v" , err )
return err
}
for _ , comment := range comments {
if _ , err := sess . Table ( "comment" ) . ID ( comment . ID ) . Cols ( "commit_sha" , "patch" , "invalidated" ) . Update ( comment ) ; err != nil {
log . Error ( "failed to update comment[%d]: %v %v" , comment . ID , comment , err )
return err
}
}
start += len ( comments )
if err := sess . Commit ( ) ; err != nil {
return err
}
if len ( comments ) < batchSize {
break
}
}
return nil
}