]> source.dussan.org Git - gitea.git/commitdiff
Fix migration bug on v96.go (#10572) (#10573)
authorguillep2k <18600385+guillep2k@users.noreply.github.com>
Mon, 2 Mar 2020 16:32:20 +0000 (13:32 -0300)
committerGitHub <noreply@github.com>
Mon, 2 Mar 2020 16:32:20 +0000 (10:32 -0600)
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
models/migrations/v96.go

index b8eb20159139900a3a68ea1a4bf9700375d9df0b..7a1684354aede97df6f4da827b4db6611bad8165 100644 (file)
@@ -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()
 }