@@ -866,32 +866,23 @@ public function internalErrorAction(Request $request): ?int
866
866
867
867
if ($ field_name !== null ) {
868
868
// Disable any outstanding judgetasks with the same script that have not been claimed yet.
869
- $ this ->em ->wrapInTransaction (function (EntityManager $ em ) use ($ field_name , $ disabled_id , $ error ) {
870
- $ judgingids = $ em ->getConnection ()->executeQuery (
871
- 'SELECT DISTINCT jobid '
872
- . ' FROM judgetask '
873
- . ' WHERE ' . $ field_name . ' = :id '
874
- . ' AND judgehostid IS NULL '
875
- . ' AND valid = 1 ' ,
876
- [
877
- 'id ' => $ disabled_id ,
878
- ]
879
- )->fetchFirstColumn ();
880
- $ judgings = $ em ->getRepository (Judging::class)->findBy (['judgingid ' => $ judgingids ]);
881
- foreach ($ judgings as $ judging ) {
882
- /** @var Judging $judging */
883
- $ judging ->setInternalError ($ error );
884
- }
885
- $ em ->flush ();
886
- $ em ->getConnection ()->executeStatement (
887
- 'UPDATE judgetask SET valid=0 '
888
- . ' WHERE ' . $ field_name . ' = :id '
889
- . ' AND judgehostid IS NULL ' ,
890
- [
891
- 'id ' => $ disabled_id ,
892
- ]
893
- );
894
- });
869
+ $ rows = $ this ->em ->createQueryBuilder ()
870
+ ->update (Judging::class, 'j ' )
871
+ ->leftJoin (JudgeTask::class, 'jt ' )
872
+ ->set ('j.internal_error ' , $ error )
873
+ ->set ('jt.valid ' , 0 )
874
+ ->where ('jt. ' . $ field_name . ' = :id ' )
875
+ ->andWhere ('j.internal_error IS NULL ' )
876
+ ->andWhere ('jt.judgehost_id IS NULL ' )
877
+ ->andWhere ('jt.valid = 1 ' )
878
+ ->setParameter ('id ' , $ disabled_id )
879
+ ->distinct ()
880
+ ->getQuery ()
881
+ ->getArrayResult ();
882
+
883
+ if ($ rows == 0 ) {
884
+ // TODO, handle this case. Nothing was updated.
885
+ }
895
886
}
896
887
897
888
$ this ->dj ->setInternalError ($ disabled , $ contest , false );
0 commit comments