70 lines
2.1 KiB
SQL
Executable File
70 lines
2.1 KiB
SQL
Executable File
DELIMITER $$
|
|
DROP trigger IF EXISTS `jol`.`tri_moodle` $$
|
|
create trigger tri_moodle
|
|
after update on solution
|
|
for each row
|
|
begin
|
|
declare mark int;
|
|
declare total int;
|
|
|
|
select count(1) into total from contest_problem where contest_id=new.contest_id;
|
|
if total>0 then
|
|
select sum(ac)/total*100 into mark
|
|
from (select max(pass_rate) ac from solution where user_id=new.user_id and contest_id=new.contest_id and problem_id>0 group by problem_id) s;
|
|
|
|
call update_moodle(new.contest_id,new.user_id,mark);
|
|
|
|
end if;
|
|
end $$
|
|
|
|
|
|
CREATE PROCEDURE `update_moodle`(IN `cid` INT, IN `user_id` VARCHAR(20), IN `mark` INT)
|
|
top:BEGIN
|
|
declare as_id int;
|
|
declare u_id int;
|
|
declare nowtime int;
|
|
declare oldid int;
|
|
set nowtime=UNIX_TIMESTAMP(now());
|
|
set as_id=0;
|
|
select m.id into as_id from
|
|
moodle.mdl_assign m
|
|
where m.name = concat('[OJ]-C',cid);
|
|
if as_id=0 then
|
|
leave top;
|
|
end if;
|
|
set u_id =-1;
|
|
select m.id into u_id from moodle.mdl_user m where username=user_id;
|
|
select mag.grade into oldid from moodle.mdl_assign_grades mag
|
|
where assignment=as_id and userid=u_id;
|
|
|
|
set oldid=-1;
|
|
|
|
select id into oldid from moodle.mdl_assign_submission m
|
|
where assignment=as_id and userid=u_id;
|
|
if oldid =-1 then
|
|
|
|
insert into moodle.mdl_assign_submission
|
|
(assignment,userid,timecreated,timemodified,status,attemptnumber)
|
|
values( as_id ,u_id ,nowtime ,nowtime ,'new' ,0);
|
|
insert into moodle.mdl_assign_grades(assignment,userid,timecreated,timemodified,grader,grade,attemptnumber)
|
|
select ma.id,mas.userid,UNIX_TIMESTAMP( NOW( ) ),UNIX_TIMESTAMP( NOW( ) ),2,mark,mas.attemptnumber
|
|
from moodle.mdl_assign ma
|
|
inner join moodle.mdl_assign_submission mas on
|
|
mas.assignment=ma.id and mas.status='new'
|
|
where concat(ma.id,',',mas.userid) not in (select concat(assignment,',',userid) from moodle.mdl_assign_grades);
|
|
|
|
else
|
|
|
|
|
|
update moodle.mdl_assign_grades
|
|
set grade=mark,timemodified=nowtime where
|
|
assignment=as_id and userid=u_id;
|
|
|
|
end if;
|
|
|
|
|
|
END$$
|
|
|
|
|
|
DELIMITER ;
|