class StoredStatusProcedure < ActiveRecord::Migration def up #sql = <<- END_OF_SQL_CODE execute " create procedure `sp_user_status_cursor`() begin declare v_uid bigint(22); declare v int(10); declare _done TINYINT(1) default 0; declare cur_user cursor for select user_id, count(*) from changesets where user_id != '' group by user_id; declare continue handler for not found set _done = 1; open cur_user; loop_xxx:loop fetch cur_user into v_uid,v; if _done=1 then leave loop_xxx; end if; begin update user_statuses set changesets_count = v where user_id = v_uid; commit; end; end loop; end; " execute " create event if not exists e_test on schedule every 1 day starts'2013_08_27 01:50:00' on completion preserve do call `sp_user_status_cursor`(); " execute " create procedure `sp_project_status_cursor`() begin declare v_uid bigint(22); declare v int(10); declare _done TINYINT(1) default 0; declare cur_user cursor for select project_id,count(*) from (select project_id,repositories.id from repositories inner join changesets where repositories.id = changesets.repository_id)t group by project_id; declare continue handler for not found set _done = 1; open cur_user; loop_xxx:loop fetch cur_user into v_uid,v; if _done=1 then leave loop_xxx; end if; begin update project_statuses set changesets_count = v where project_id = v_uid; commit; end; end loop; end; " execute " create event if not exists e_project_status_test on schedule every 1 day starts'2013_08_27 01:50:00' on completion preserve do call `sp_project_status_cursor`(); " execute " set global event_scheduler = on; " end def down execute " drop procedure if exists `sp_user_status_cursor`; " execute " drop event if exists e_test; " execute " drop procedure if exists `sp_project_status_cursor`; " execute " drop event if exists e_project_status_test; " end end