| @@ -26,23 +26,38 @@ func deleteOrphanedAttachments(x *xorm.Engine) error { | |||||
| sess := x.NewSession() | sess := x.NewSession() | ||||
| defer sess.Close() | 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 | return err | ||||
| }) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| } | |||||
| if len(attachements) < limit { | |||||
| return nil | |||||
| } | |||||
| } | } | ||||
| return sess.Commit() | |||||
| } | } | ||||