2019-09-22 12:05:48 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-09-22 12:05:48 +03:00
2022-11-02 11:54:36 +03:00
package v1_10 //nolint
2019-09-22 12:05:48 +03:00
import (
2020-08-18 07:23:45 +03:00
"path/filepath"
2019-09-22 12:05:48 +03:00
"code.gitea.io/gitea/modules/setting"
2020-08-11 23:05:34 +03:00
"code.gitea.io/gitea/modules/util"
2019-09-22 12:05:48 +03:00
2019-10-17 12:26:49 +03:00
"xorm.io/xorm"
2019-09-22 12:05:48 +03:00
)
2022-11-02 11:54:36 +03:00
func DeleteOrphanedAttachments ( x * xorm . Engine ) error {
2019-09-22 12:05:48 +03:00
type Attachment struct {
ID int64 ` xorm:"pk autoincr" `
UUID string ` xorm:"uuid UNIQUE" `
IssueID int64 ` xorm:"INDEX" `
ReleaseID int64 ` xorm:"INDEX" `
CommentID int64
}
sess := x . NewSession ( )
defer sess . Close ( )
2021-03-14 21:52:12 +03:00
limit := setting . Database . IterateBufferSize
2020-03-02 18:53:39 +03:00
if limit <= 0 {
limit = 50
}
2019-09-22 12:05:48 +03:00
2020-03-02 18:53:39 +03:00
for {
2022-12-09 09:35:56 +03:00
attachments := make ( [ ] Attachment , 0 , limit )
2020-03-02 18:53:39 +03:00
if err := sess . Where ( "`issue_id` = 0 and (`release_id` = 0 or `release_id` not in (select `id` from `release`))" ) .
Cols ( "id, uuid" ) . Limit ( limit ) .
Asc ( "id" ) .
2022-12-09 09:35:56 +03:00
Find ( & attachments ) ; err != nil {
2020-03-02 18:53:39 +03:00
return err
}
2022-12-09 09:35:56 +03:00
if len ( attachments ) == 0 {
2020-03-02 18:53:39 +03:00
return nil
}
2021-03-14 21:52:12 +03:00
ids := make ( [ ] int64 , 0 , limit )
2022-12-09 09:35:56 +03:00
for _ , attachment := range attachments {
2020-03-02 18:53:39 +03:00
ids = append ( ids , attachment . ID )
}
2020-08-18 07:23:45 +03:00
if len ( ids ) > 0 {
if _ , err := sess . In ( "id" , ids ) . Delete ( new ( Attachment ) ) ; err != nil {
return err
}
2020-03-02 18:53:39 +03:00
}
2022-12-09 09:35:56 +03:00
for _ , attachment := range attachments {
2020-08-18 07:23:45 +03:00
uuid := attachment . UUID
2023-06-14 06:42:38 +03:00
if err := util . RemoveAll ( filepath . Join ( setting . Attachment . Storage . Path , uuid [ 0 : 1 ] , uuid [ 1 : 2 ] , uuid ) ) ; err != nil {
2019-09-22 12:05:48 +03:00
return err
2020-03-02 18:53:39 +03:00
}
}
2022-12-09 09:35:56 +03:00
if len ( attachments ) < limit {
2020-03-02 18:53:39 +03:00
return nil
}
2019-09-22 12:05:48 +03:00
}
}