|
|
|
@ -26,23 +26,38 @@ func deleteOrphanedAttachments(x *xorm.Engine) error { |
|
|
|
|
sess := x.NewSession() |
|
|
|
|
defer sess.Close() |
|
|
|
|
|
|
|
|
|
err := sess.BufferSize(setting.Database.IterateBufferSize). |
|
|
|
|
Where("`issue_id` = 0 and (`release_id` = 0 or `release_id` not in (select `id` from `release`))").Cols("uuid"). |
|
|
|
|
Iterate(new(Attachment), |
|
|
|
|
func(idx int, bean interface{}) error { |
|
|
|
|
attachment := bean.(*Attachment) |
|
|
|
|
|
|
|
|
|
if err := os.RemoveAll(models.AttachmentLocalPath(attachment.UUID)); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
var limit = setting.Database.IterateBufferSize |
|
|
|
|
if limit <= 0 { |
|
|
|
|
limit = 50 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_, err := sess.ID(attachment.ID).NoAutoCondition().Delete(attachment) |
|
|
|
|
for { |
|
|
|
|
attachements := make([]Attachment, 0, limit) |
|
|
|
|
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"). |
|
|
|
|
Find(&attachements); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
if len(attachements) == 0 { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var ids = make([]int64, 0, limit) |
|
|
|
|
for _, attachment := range attachements { |
|
|
|
|
ids = append(ids, attachment.ID) |
|
|
|
|
} |
|
|
|
|
if _, err := sess.In("id", ids).Delete(new(Attachment)); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, attachment := range attachements { |
|
|
|
|
if err := os.RemoveAll(models.AttachmentLocalPath(attachment.UUID)); err != nil { |
|
|
|
|
return err |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if len(attachements) < limit { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return sess.Commit() |
|
|
|
|
} |
|
|
|
|