function build_cron_item($cronid, $crondata = '') { global $vbulletin; if (!is_array($crondata)) { $crondata = $vbulletin->db->query_first("\n\t\t\tSELECT *\n\t\t\tFROM " . TABLE_PREFIX . "cron\n\t\t\tWHERE cronid = " . intval($cronid)); } $minutenow = intval(date('i', TIMENOW)); $hournow = intval(date('H', TIMENOW)); $daynow = intval(date('d', TIMENOW)); $monthnow = intval(date('m', TIMENOW)); $yearnow = intval(date('Y', TIMENOW)); $weekdaynow = intval(date('w', TIMENOW)); // ok need to work out, date and time of 1st and 2nd next opportunities to run if ($crondata['weekday'] == -1) { // any day of week: if ($crondata['day'] == -1) { // any day of month: $firstday = $daynow; $secondday = $daynow + 1; } else { // specific day of month: $firstday = $crondata['day']; $secondday = $crondata['day'] + date('t', TIMENOW); // number of days this month } } else { // specific day of week: $firstday = $daynow + ($crondata['weekday'] - $weekdaynow); $secondday = $firstday + 7; } if ($firstday < $daynow) { $firstday = $secondday; } if ($firstday == $daynow) { // next run is due today? $todaytime = fetch_cron_next_run($crondata); // see if possible to run again today if ($todaytime['hour'] == -1 and $todaytime['minute'] == -1) { // can't run today $crondata['day'] = $secondday; $newtime = fetch_cron_next_run($crondata, 0, -1); $crondata['hour'] = $newtime['hour']; $crondata['minute'] = $newtime['minute']; } else { $crondata['day'] = $firstday; $crondata['hour'] = $todaytime['hour']; $crondata['minute'] = $todaytime['minute']; } } else { $crondata['day'] = $firstday; $newtime = fetch_cron_next_run($crondata, 0, -1); // work out first run time that day $crondata['hour'] = $newtime['hour']; $crondata['minute'] = $newtime['minute']; } $nextrun = mktime($crondata['hour'], $crondata['minute'], 0, $monthnow, $crondata['day'], $yearnow); // save it $vbulletin->db->query_write("\n\t\tUPDATE " . TABLE_PREFIX . "cron\n\t\tSET nextrun = " . $nextrun . "\n\t\tWHERE cronid = " . intval($cronid) . " AND nextrun = " . $crondata['nextrun']); $not_run = $vbulletin->db->affected_rows() > 0; build_cron_next_run($nextrun); return iif($not_run, $nextrun, 0); }
function build_cron_item($cronid, $crondata = '') { if (!is_array($crondata)) { $crondata = vB::getDbAssertor()->getRow('cron', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, 'cronid' => intval($cronid))); } $timenow = vB::getRequest()->getTimeNow(); $minutenow = intval(date('i', $timenow)); $hournow = intval(date('H', $timenow)); $daynow = intval(date('d', $timenow)); $monthnow = intval(date('m', $timenow)); $yearnow = intval(date('Y', $timenow)); $weekdaynow = intval(date('w', $timenow)); // ok need to work out, date and time of 1st and 2nd next opportunities to run if ($crondata['weekday'] == -1) { // any day of week: if ($crondata['day'] == -1) { // any day of month: $firstday = $daynow; $secondday = $daynow + 1; } else { // specific day of month: $firstday = $crondata['day']; $secondday = $crondata['day'] + date('t', $timenow); // number of days this month } } else { // specific day of week: $firstday = $daynow + ($crondata['weekday'] - $weekdaynow); $secondday = $firstday + 7; } if ($firstday < $daynow) { $firstday = $secondday; } if ($firstday == $daynow) { // next run is due today? $todaytime = fetch_cron_next_run($crondata); // see if possible to run again today if ($todaytime['hour'] == -1 and $todaytime['minute'] == -1) { // can't run today $crondata['day'] = $secondday; $newtime = fetch_cron_next_run($crondata, 0, -1); $crondata['hour'] = $newtime['hour']; $crondata['minute'] = $newtime['minute']; } else { $crondata['day'] = $firstday; $crondata['hour'] = $todaytime['hour']; $crondata['minute'] = $todaytime['minute']; } } else { $crondata['day'] = $firstday; $newtime = fetch_cron_next_run($crondata, 0, -1); // work out first run time that day $crondata['hour'] = $newtime['hour']; $crondata['minute'] = $newtime['minute']; } $nextrun = mktime($crondata['hour'], $crondata['minute'], 0, $monthnow, $crondata['day'], $yearnow); // save it $affectedrows = vB::getDbAssertor()->assertQuery('cron', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_UPDATE, 'nextrun' => $nextrun, vB_dB_Query::CONDITIONS_KEY => array('cronid' => intval($cronid), 'nextrun' => $crondata['nextrun']))); $not_run = $affectedrows > 0; build_cron_next_run($nextrun); return iif($not_run, $nextrun, 0); }