Index: branches/RC/core/kernel/event_manager.php =================================================================== diff -u -N -r10863 -r10887 --- branches/RC/core/kernel/event_manager.php (.../event_manager.php) (revision 10863) +++ branches/RC/core/kernel/event_manager.php (.../event_manager.php) (revision 10887) @@ -78,8 +78,53 @@ parent::kBase(); $this->Conn =& $this->Application->GetADODBConnection(); } + /** + * Returns information about registered regular events + * + * @param bool $from_cache + * + * @return Array + */ + function getRegularEvents($from_cache = false) + { + static $agents = null; + + if ($from_cache) { + return Array ( + reBEFORE => $this->beforeRegularEvents, + reAFTER => $this->afterRegularEvents, + ); + } + else { + if (!isset($agents)) { + $sql = 'SELECT * + FROM ' . $this->Application->getUnitOption('agent', 'TableName') . ' + WHERE Status = ' . STATUS_ACTIVE . ' AND LastRunStatus <> ' . AGENT_LAST_RUN_RUNNING; + $all_agents = $this->Conn->Query($sql); + + $agents = Array ( + reBEFORE => Array (), + reAFTER => Array (), + ); + + foreach ($all_agents as $agent_data) { + $agents[ $agent_data['RunMode'] ][ $agent_data['AgentName'] ] = Array ( + 'EventName' => $agent_data['Event'], + 'RunInterval' => (int)$agent_data['RunInterval'], + 'LastRunOn' => (int)$agent_data['LastRunOn'], + 'NextRunOn' => (int)$agent_data['NextRunOn'], + ); + } + } + + return $agents; + } + } + + + /** * Set's new enviroment parameter mappings * between their names as application vars * @@ -539,17 +584,82 @@ * * @param int $event_type */ + function RunRegularEvents($event_type = reBEFORE, $from_cron=false) { if (defined('IS_INSTALL')) return ; // if RegularEvents are set to run from cron if (!$from_cron && $this->Application->ConfigValue('UseCronForRegularEvent')) return ; + + $agents = $this->getRegularEvents(); + $events_source = $agents[$event_type]; + + $user_id = $this->Application->RecallVar('user_id'); + $this->Application->StoreVar('user_id', -1, true); // to prevent permission checking inside events, true for optional storage + + foreach ($events_source as $short_name => $event_data) { + $next_run = $event_data['NextRunOn']; + $last_run = $event_data['LastRunOn']; + + if ($next_run && ($next_run > adodb_mktime())) { + continue; + } + else { + $event = new kEvent($event_data['EventName']); + if (!$this->Application->prefixRegistred($event->Prefix)) { + // don't process agents, left from disabled modules + continue; + } + + $start_time = adodb_mktime(); + $fields_hash = Array ( + 'LastRunOn' => $start_time, + 'LastRunStatus' => AGENT_LAST_RUN_RUNNING, + 'NextRunOn' => $start_time + $event_data['RunInterval'], + ); + + $this->Conn->doUpdate( + $fields_hash, + $this->Application->getUnitOption('agent', 'TableName'), + 'AgentName = ' . $this->Conn->qstr($short_name) + ); + + $event->redirect = false; + $this->Application->HandleEvent($event); + + $now = adodb_mktime(); + $next_run = $event_data['RunInterval'] ? $start_time + $event_data['RunInterval'] : $now; + + while ($next_run < $now) { + // in case event execution took longer, then RunInterval (don't use <=, because RunInterval can be 0) + $next_run += $event_data['RunInterval']; + } + + $fields_hash = Array ( + 'NextRunOn' => $next_run, + 'RunTime' => round(($now - $start_time) / 60), + 'LastRunStatus' => $event->status == erSUCCESS ? AGENT_LAST_RUN_SUCCEDED : AGENT_LAST_RUN_FAILED, + ); + + $this->Conn->doUpdate( + $fields_hash, + $this->Application->getUnitOption('agent', 'TableName'), + 'AgentName = ' . $this->Conn->qstr($short_name) + ); + } + } + + $this->Application->StoreVar('user_id', $user_id, true); // true for optional + } + +/* + function RunRegularEvents($event_type = reBEFORE, $from_cron=false) + { + if (defined('IS_INSTALL')) return ; + // if RegularEvents are set to run from cron + if (!$from_cron && $this->Application->ConfigValue('UseCronForRegularEvent')) return ; $events_source = ($event_type == reBEFORE) ? $this->beforeRegularEvents : $this->afterRegularEvents; - /*if(rand(0, 100) < 90) - { - return; - }*/ $sql = 'SELECT Data FROM '.TABLE_PREFIX.'Cache @@ -581,7 +691,7 @@ ); $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'Cache', 'REPLACE'); } - +*/ /** * Allows to determine, that required event is beeing processed right now *