@@ -696,85 +696,100 @@ func UpdateReactionsMigrationsByType(ctx context.Context, gitServiceType api.Git
696
696
697
697
// DeleteIssuesByRepoID deletes issues by repositories id
698
698
func DeleteIssuesByRepoID (ctx context.Context , repoID int64 ) (attachmentPaths []string , err error ) {
699
- deleteCond := builder . Select ( "id" ). From ( "issue" ). Where (builder. Eq { "issue.repo_id" : repoID })
700
-
699
+ // MariaDB has a performance bug: https://jira.mariadb.org/browse/MDEV-16289
700
+ // so here it uses "DELETE ... WHERE IN" with pre-queried IDs.
701
701
sess := db .GetEngine (ctx )
702
- // Delete content histories
703
- if _ , err = sess .In ("issue_id" , deleteCond ).
704
- Delete (& ContentHistory {}); err != nil {
705
- return nil , err
706
- }
707
702
708
- // Delete comments and attachments
709
- if _ , err = sess .In ("issue_id" , deleteCond ).
710
- Delete (& Comment {}); err != nil {
711
- return nil , err
712
- }
703
+ for {
704
+ issueIDs := make ([]int64 , 0 , db .DefaultMaxInSize )
713
705
714
- // Dependencies for issues in this repository
715
- if _ , err = sess .In ("issue_id" , deleteCond ).
716
- Delete (& IssueDependency {}); err != nil {
717
- return nil , err
718
- }
706
+ err := sess .Table (& Issue {}).Where ("repo_id = ?" , repoID ).OrderBy ("id" ).Limit (db .DefaultMaxInSize ).Cols ("id" ).Find (& issueIDs )
707
+ if err != nil {
708
+ return nil , err
709
+ }
719
710
720
- // Delete dependencies for issues in other repositories
721
- if _ , err = sess .In ("dependency_id" , deleteCond ).
722
- Delete (& IssueDependency {}); err != nil {
723
- return nil , err
724
- }
711
+ if len (issueIDs ) == 0 {
712
+ break
713
+ }
725
714
726
- if _ , err = sess .In ("issue_id" , deleteCond ).
727
- Delete (& IssueUser {}); err != nil {
728
- return nil , err
729
- }
715
+ // Delete content histories
716
+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& ContentHistory {})
717
+ if err != nil {
718
+ return nil , err
719
+ }
730
720
731
- if _ , err = sess .In ("issue_id" , deleteCond ).
732
- Delete (& Reaction {}); err != nil {
733
- return nil , err
734
- }
721
+ // Delete comments and attachments
722
+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& Comment {})
723
+ if err != nil {
724
+ return nil , err
725
+ }
735
726
736
- if _ , err = sess .In ("issue_id" , deleteCond ).
737
- Delete (& IssueWatch {}); err != nil {
738
- return nil , err
739
- }
727
+ // Dependencies for issues in this repository
728
+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& IssueDependency {})
729
+ if err != nil {
730
+ return nil , err
731
+ }
740
732
741
- if _ , err = sess .In ("issue_id" , deleteCond ).
742
- Delete (& Stopwatch {}); err != nil {
743
- return nil , err
744
- }
733
+ // Delete dependencies for issues in other repositories
734
+ _ , err = sess .In ("dependency_id" , issueIDs ).Delete (& IssueDependency {})
735
+ if err != nil {
736
+ return nil , err
737
+ }
745
738
746
- if _ , err = sess .In ("issue_id" , deleteCond ).
747
- Delete ( & TrackedTime {}); err != nil {
748
- return nil , err
749
- }
739
+ _ , err = sess .In ("issue_id" , issueIDs ). Delete ( & IssueUser {})
740
+ if err != nil {
741
+ return nil , err
742
+ }
750
743
751
- if _ , err = sess .In ("issue_id" , deleteCond ).
752
- Delete ( & project_model. ProjectIssue {}); err != nil {
753
- return nil , err
754
- }
744
+ _ , err = sess .In ("issue_id" , issueIDs ). Delete ( & Reaction {})
745
+ if err != nil {
746
+ return nil , err
747
+ }
755
748
756
- if _ , err = sess .In ("dependent_issue_id " , deleteCond ).
757
- Delete ( & Comment {}); err != nil {
758
- return nil , err
759
- }
749
+ _ , err = sess .In ("issue_id " , issueIDs ). Delete ( & IssueWatch {})
750
+ if err != nil {
751
+ return nil , err
752
+ }
760
753
761
- var attachments []* repo_model.Attachment
762
- if err = sess .In ("issue_id" , deleteCond ).
763
- Find (& attachments ); err != nil {
764
- return nil , err
765
- }
754
+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& Stopwatch {})
755
+ if err != nil {
756
+ return nil , err
757
+ }
766
758
767
- for j := range attachments {
768
- attachmentPaths = append (attachmentPaths , attachments [j ].RelativePath ())
769
- }
759
+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& TrackedTime {})
760
+ if err != nil {
761
+ return nil , err
762
+ }
770
763
771
- if _ , err = sess .In ("issue_id" , deleteCond ).
772
- Delete ( & repo_model. Attachment {}); err != nil {
773
- return nil , err
774
- }
764
+ _ , err = sess .In ("issue_id" , issueIDs ). Delete ( & project_model. ProjectIssue {})
765
+ if err != nil {
766
+ return nil , err
767
+ }
775
768
776
- if _ , err = db .DeleteByBean (ctx , & Issue {RepoID : repoID }); err != nil {
777
- return nil , err
769
+ _ , err = sess .In ("dependent_issue_id" , issueIDs ).Delete (& Comment {})
770
+ if err != nil {
771
+ return nil , err
772
+ }
773
+
774
+ var attachments []* repo_model.Attachment
775
+ err = sess .In ("issue_id" , issueIDs ).Find (& attachments )
776
+ if err != nil {
777
+ return nil , err
778
+ }
779
+
780
+ for j := range attachments {
781
+ attachmentPaths = append (attachmentPaths , attachments [j ].RelativePath ())
782
+ }
783
+
784
+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& repo_model.Attachment {})
785
+ if err != nil {
786
+ return nil , err
787
+ }
788
+
789
+ _ , err = sess .In ("id" , issueIDs ).Delete (& Issue {})
790
+ if err != nil {
791
+ return nil , err
792
+ }
778
793
}
779
794
780
795
return attachmentPaths , err
0 commit comments