示例#1
0
 /**
  * @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;
 }
示例#2
0
 /**
  * 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;
         }
     }
 }
示例#4
0
 /**
  * @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));
 }