/** * @see \wcf\data\IEditableObject::create() */ public static function create(array $parameters = array()) { $descriptions = array(); if (isset($parameters['description']) && is_array($parameters['description'])) { if (count($parameters['description']) > 1) { $descriptions = $parameters['description']; $parameters['description'] = ''; } else { $parameters['description'] = reset($parameters['description']); } } $cronjob = parent::create($parameters); // save cronjob description if (!empty($descriptions)) { // set default value if (isset($descriptions[''])) { $defaultValue = $descriptions['']; } else { if (isset($descriptions['en'])) { // fallback to English $defaultValue = $descriptions['en']; } else { if (isset($descriptions[WCF::getLanguage()->getFixedLanguageCode()])) { // fallback to the language of the current user $defaultValue = $descriptions[WCF::getLanguage()->getFixedLanguageCode()]; } else { // fallback to first description $defaultValue = reset($descriptions); } } } // fetch data directly from database during framework installation if (!PACKAGE_ID) { $sql = "SELECT\t*\n\t\t\t\t\tFROM\twcf" . WCF_N . "_language_category\n\t\t\t\t\tWHERE\tlanguageCategory = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array('wcf.acp.cronjob')); $languageCategory = $statement->fetchObject('wcf\\data\\language\\category\\LanguageCategory'); $languages = new LanguageList(); $languages->readObjects(); } else { $languages = LanguageFactory::getInstance()->getLanguages(); $languageCategory = LanguageFactory::getInstance()->getCategory('wcf.acp.cronjob'); } $sql = "INSERT INTO\twcf" . WCF_N . "_language_item\n\t\t\t\t\t\t(languageID, languageItem, languageItemValue, languageCategoryID, packageID)\n\t\t\t\tVALUES\t\t(?, ?, ?, ?, ?)\n\t\t\t\tON DUPLICATE KEY UPDATE languageItemValue = VALUES(languageItemValue)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($languages as $language) { $value = $defaultValue; if (isset($descriptions[$language->languageCode])) { $value = $descriptions[$language->languageCode]; } $statement->execute(array($language->languageID, 'wcf.acp.cronjob.description.cronjob' . $cronjob->cronjobID, $value, $languageCategory->languageCategoryID, $cronjob->packageID)); } // update cronjob $cronjobEditor = new CronjobEditor($cronjob); $cronjobEditor->update(array('description' => 'wcf.acp.cronjob.description.cronjob' . $cronjob->cronjobID)); } return $cronjob; }
/** * Loads outstanding cronjobs. */ protected function loadCronjobs() { $conditions = new PreparedStatementConditionBuilder(); $conditions->add("cronjob.packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies())); $conditions->add("(cronjob.nextExec <= ? OR cronjob.afterNextExec <= ?)", array(TIME_NOW, TIME_NOW)); $conditions->add("cronjob.active = ?", array(1)); $conditions->add("cronjob.failCount < ?", array(3)); $conditions->add("cronjob.state = ?", array(Cronjob::READY)); $sql = "SELECT\t\tcronjob.*\n\t\t\tFROM\t\twcf" . WCF_N . "_cronjob cronjob\n\t\t\t" . $conditions; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($conditions->getParameters()); while ($row = $statement->fetchArray()) { $cronjob = new Cronjob(null, $row); $cronjobEditor = new CronjobEditor($cronjob); $executeCronjob = true; $data = array('state' => Cronjob::PENDING); // reset cronjob if it got stuck before and afterNextExec is in the past if ($cronjobEditor->afterNextExec <= TIME_NOW && $cronjobEditor->state == Cronjob::EXECUTING) { $failCount = $cronjobEditor->failCount + 1; $data['failCount'] = $failCount; // disable cronjob if ($failCount == 3) { $data['active'] = 0; $executeCronjob = false; } } else { if ($cronjobEditor->nextExec <= TIME_NOW && $cronjobEditor->state != Cronjob::READY) { $executeCronjob = false; } } // mark cronjob as pending, preventing parallel execution $cronjobEditor->update($data); if ($executeCronjob) { $this->cronjobEditors[] = $cronjobEditor; } } }
/** * Loads outstanding cronjobs. */ protected function loadCronjobs() { $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_cronjob cronjob\n\t\t\tWHERE\t(cronjob.nextExec <= ? OR cronjob.afterNextExec <= ?)\n\t\t\t\tAND cronjob.isDisabled = ?\n\t\t\t\tAND cronjob.failCount < ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array(TIME_NOW, TIME_NOW, 0, Cronjob::MAX_FAIL_COUNT)); while ($row = $statement->fetchArray()) { $cronjob = new Cronjob(null, $row); $cronjobEditor = new CronjobEditor($cronjob); $executeCronjob = true; $data = array('state' => Cronjob::PENDING); // reset cronjob if it got stuck before and afterNextExec is in the past if ($cronjobEditor->afterNextExec <= TIME_NOW) { if ($cronjobEditor->state == Cronjob::EXECUTING) { $failCount = $cronjobEditor->failCount + 1; $data['failCount'] = $failCount; // disable cronjob if ($failCount == Cronjob::MAX_FAIL_COUNT) { $data['isDisabled'] = 1; $data['state'] = 0; $executeCronjob = false; } } } else { if ($cronjobEditor->nextExec <= TIME_NOW && $cronjobEditor->state != Cronjob::READY) { $executeCronjob = false; } } // mark cronjob as pending, preventing parallel execution $cronjobEditor->update($data); if ($executeCronjob) { $this->cronjobEditors[] = $cronjobEditor; } } }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); // save cronjob $data = array_merge($this->additionalFields, array('className' => $this->className, 'packageID' => $this->packageID, 'description' => $this->description, 'startMinute' => $this->startMinute, 'startHour' => $this->startHour, 'startDom' => $this->startDom, 'startMonth' => $this->startMonth, 'startDow' => $this->startDow)); $this->objectAction = new CronjobAction(array(), 'create', array('data' => $data)); $this->objectAction->executeAction(); if (!I18nHandler::getInstance()->isPlainValue('description')) { $returnValues = $this->objectAction->getReturnValues(); $cronjobID = $returnValues['returnValues']->cronjobID; I18nHandler::getInstance()->save('description', 'wcf.acp.cronjob.description.cronjob' . $cronjobID, 'wcf.acp.cronjob', $this->packageID); // update group name $cronjobEditor = new CronjobEditor($returnValues['returnValues']); $cronjobEditor->update(array('description' => 'wcf.acp.cronjob.description.cronjob' . $cronjobID)); } $this->saved(); // reset values $this->className = $this->description = ''; $this->startMinute = $this->startHour = $this->startDom = $this->startMonth = $this->startDow = '*'; I18nHandler::getInstance()->reset(); // show success. WCF::getTPL()->assign(array('success' => true)); }