/**
  * @see wcf\system\ICronjob::execute()
  */
 public function execute(Cronjob $cronjob)
 {
     $filename = FileUtil::downloadFileFromHttp('http://www.woltlab.com/spiderlist/spiderlist.xml', 'spiders');
     $xml = new XML();
     $xml->load($filename);
     $xpath = $xml->xpath();
     // fetch spiders
     $spiders = $xpath->query('/spiderlist/spider');
     if (count($spiders)) {
         // delete old entries
         $sql = "DELETE FROM wcf" . WCF_N . "_spider";
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute();
         $statementParameters = array();
         foreach ($spiders as $spider) {
             $identifier = StringUtil::toLowerCase($spider->getAttribute('ident'));
             $name = $xpath->query('name', $spider)->item(0);
             $info = $xpath->query('info', $spider)->item(0);
             $statementParameters[$identifier] = array('spiderIdentifier' => $identifier, 'spiderName' => $name->nodeValue, 'spiderURL' => $info ? $info->nodeValue : '');
         }
         if (!empty($statementParameters)) {
             $sql = "INSERT INTO\twcf" . WCF_N . "_spider\n\t\t\t\t\t\t\t(spiderIdentifier, spiderName, spiderURL)\n\t\t\t\t\tVALUES\t\t(?, ?, ?)";
             $statement = WCF::getDB()->prepareStatement($sql);
             foreach ($statementParameters as $parameters) {
                 $statement->execute(array($parameters['spiderIdentifier'], $parameters['spiderName'], $parameters['spiderURL']));
             }
         }
         // clear spider cache
         CacheHandler::getInstance()->clear(WCF_DIR . 'cache', 'cache.spiders.php');
     }
     // delete tmp file
     @unlink($filename);
 }
 /**
  * Fetches a user from the database.
  */
 protected function getObject()
 {
     $sql = "SELECT\t\tuserID, registrationDate\n\t\t\tFROM\t\twcf" . WCF_N . "_user\n\t\t\tORDER BY\tuserID ASC";
     $statement = \wcf\system\WCF::getDB()->prepareStatement($sql, 1, $this->generator->numberBetween(0, $this->userCount - 1));
     $statement->execute();
     $this->receiver = $statement->fetchObject('\\wcf\\data\\user\\User');
 }
 /**
  * @see	\wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
  */
 protected function rebuild(array $parameters)
 {
     $data = array('boxes' => array(), 'pages' => array());
     // load boxes
     $boxList = new DashboardBoxList();
     $boxList->readObjects();
     foreach ($boxList as $box) {
         $data['boxes'][$box->boxID] = $box;
     }
     // load settings
     $objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.user.dashboardContainer');
     $objectTypeIDs = array();
     foreach ($objectTypes as $objectType) {
         $objectTypeIDs[] = $objectType->objectTypeID;
     }
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("objectTypeID IN (?)", array($objectTypeIDs));
     $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_dashboard_option\n\t\t\t" . $conditions . "\n\t\t\tORDER BY\tshowOrder ASC";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($conditions->getParameters());
     while ($row = $statement->fetchArray()) {
         if (!isset($data['pages'][$row['objectTypeID']])) {
             $data['pages'][$row['objectTypeID']] = array();
         }
         $data['pages'][$row['objectTypeID']][] = $row['boxID'];
     }
     return $data;
 }
 /**
  * @see	\wcf\system\importer\IImporter::import()
  */
 public function import($oldID, array $data, array $additionalData = array())
 {
     $data['packageID'] = 1;
     // set temporary option name
     $data['optionName'] = StringUtil::getRandomID();
     if ($data['optionType'] == 'boolean' || $data['optionType'] == 'integer') {
         if (isset($data['defaultValue'])) {
             $data['defaultValue'] = intval($data['defaultValue']);
         }
     }
     // create category
     $this->createCategory($data['categoryName']);
     // save option
     $action = new UserOptionAction(array(), 'create', array('data' => $data));
     $returnValues = $action->executeAction();
     $userOption = $returnValues['returnValues'];
     // update generic option name
     $editor = new UserOptionEditor($userOption);
     $editor->update(array('optionName' => 'option' . $userOption->optionID));
     // save name
     $sql = "INSERT IGNORE INTO\twcf" . WCF_N . "_language_item\n\t\t\t\t\t\t(languageID, languageItem, languageItemValue, languageItemOriginIsSystem, languageCategoryID, packageID)\n\t\t\tVALUES\t\t\t(?, ?, ?, ?, ?, ?)";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array(LanguageFactory::getInstance()->getDefaultLanguageID(), 'wcf.user.option.option' . $userOption->optionID, $additionalData['name'], 0, $this->languageCategoryID, 1));
     ImportHandler::getInstance()->saveNewID('com.woltlab.wcf.user.option', $oldID, $userOption->optionID);
     return $userOption->optionID;
 }
 /**
  * Deletes the cronjob log.
  */
 public static function clearLogs($packageID = PACKAGE_ID)
 {
     // delete logs
     $sql = "DELETE FROM\twcf" . WCF_N . "_cronjob_log\n\t\t\tWHERE\t\tcronjobID IN (\n\t\t\t\t\t\tSELECT\tcronjobID\n\t\t\t\t\t\tFROM\twcf" . WCF_N . "_cronjob cronjob,\n\t\t\t\t\t\t\twcf" . WCF_N . "_package_dependency package_dependency\n\t\t\t\t\t\tWHERE \tcronjob.packageID = package_dependency.dependency\n\t\t\t\t\t\t\tAND package_dependency.packageID = ?\n\t\t\t\t\t)";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($packageID);
 }
 /**
  * Enables this option.
  * 
  * @param 	boolean		$enable
  */
 public function enable($enable = true)
 {
     $value = intval(!$enable);
     $sql = "UPDATE\twcf" . WCF_N . "_user_option\n\t\t\tSET\tdisabled = ?\n\t\t\tWHERE\toptionID = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($value, $this->optionID));
 }
 /**
  * @see	\wcf\system\like\IViewableLikeProvider::prepare()
  */
 public function prepare(array $likes)
 {
     $responseIDs = array();
     foreach ($likes as $like) {
         $responseIDs[] = $like->objectID;
     }
     // get objects type ids
     $responses = array();
     $conditionBuilder = new PreparedStatementConditionBuilder();
     $conditionBuilder->add('comment_response.responseID IN (?)', array($responseIDs));
     $sql = "SELECT\t\tcomment.objectTypeID, comment_response.responseID\n\t\t\tFROM\t\twcf" . WCF_N . "_comment_response comment_response\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_comment comment\n\t\t\tON\t\t(comment.commentID = comment_response.commentID)\n\t\t\t" . $conditionBuilder;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($conditionBuilder->getParameters());
     while ($row = $statement->fetchArray()) {
         $responses[$row['responseID']] = $row['objectTypeID'];
     }
     // group likes by object type id
     $likeData = array();
     foreach ($likes as $like) {
         if (isset($responses[$like->objectID])) {
             if (!isset($likeData[$responses[$like->objectID]])) {
                 $likeData[$responses[$like->objectID]] = array();
             }
             $likeData[$responses[$like->objectID]][] = $like;
         }
     }
     foreach ($likeData as $objectTypeID => $likes) {
         $objectType = CommentHandler::getInstance()->getObjectType($objectTypeID);
         if (CommentHandler::getInstance()->getCommentManager($objectType->objectType) instanceof IViewableLikeProvider) {
             CommentHandler::getInstance()->getCommentManager($objectType->objectType)->prepare($likes);
         }
     }
 }
 /**
  * @see	\wcf\data\DatabaseObjectList::countObjects()
  */
 public function countObjects()
 {
     $sql = "SELECT\tCOUNT(*) AS count\n\t\t\tFROM\tcms" . WCF_N . "_file_to_category file_to_category,\n\t\t\t\tcms" . WCF_N . "_file file\n\t\t\t" . $this->sqlConditionJoins . "\n\t\t\t" . $this->getConditionBuilder();
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($this->getConditionBuilder()->getParameters());
     return $statement->fetchColumn();
 }
 /**
  * @see wcf\system\cache\ICacheBuilder::getData()
  */
 public function getData(array $cacheResource)
 {
     list($cache, $packageID) = explode('-', $cacheResource['cache']);
     $data = array('actions' => array('user' => array(), 'admin' => array()), 'inheritedActions' => array('user' => array(), 'admin' => array()));
     // get all listeners and filter options with low priority
     $sql = "SELECT\t\tevent_listener.*\n\t\t\tFROM\t\twcf" . WCF_N . "_event_listener event_listener\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package_dependency package_dependency\n\t\t\tON\t\t(package_dependency.dependency = event_listener.packageID)\n\t\t\tWHERE \t\tpackage_dependency.packageID = ?\n\t\t\tORDER BY\tpackage_dependency.priority ASC";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($packageID));
     while ($row = $statement->fetchArray()) {
         // distinguish between inherited actions and non-inherited actions
         if (!$row['inherit']) {
             $data['actions'][$row['environment']][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;
         } else {
             if (!isset($data['inheritedActions'][$row['environment']][$row['eventClassName']])) {
                 $data['inheritedActions'][$row['environment']][$row['eventClassName']] = array();
             }
             $data['inheritedActions'][$row['environment']][$row['eventClassName']][$row['eventName']][] = $row;
         }
     }
     // sort data by nice value and class name
     foreach ($data['actions'] as &$listenerMap) {
         foreach ($listenerMap as &$listeners) {
             uasort($listeners, array(__CLASS__, 'sortListeners'));
         }
     }
     foreach ($data['inheritedActions'] as &$listenerMap) {
         foreach ($listenerMap as &$listeners) {
             foreach ($listeners as &$val) {
                 uasort($val, array(__CLASS__, 'sortListeners'));
             }
         }
     }
     return $data;
 }
Exemple #10
0
	/**
	 * Loads style-specific variables.
	 */
	public function loadVariables() {
		if (!empty($this->variables)) {
			return;
		}
		
		$sql = "SELECT		variable.variableName, variable.defaultValue, value.variableValue
			FROM		wcf".WCF_N."_style_variable variable
			LEFT JOIN	wcf".WCF_N."_style_variable_value value
			ON		(value.variableID = variable.variableID AND value.styleID = ?)
			ORDER BY	variable.variableID ASC";
		$statement = WCF::getDB()->prepareStatement($sql);
		$statement->execute(array($this->styleID));
		while ($row = $statement->fetchArray()) {
			$variableName = $row['variableName'];
			$variableValue = (isset($row['variableValue'])) ? $row['variableValue'] : $row['defaultValue'];
			if (empty($variableValue)) {
				$variableValue = '~""';
			}
			
			$this->variables[$variableName] = $variableValue;
			
			// provide an empty value for LESS-compiler
			if (empty($this->variables[$variableName])) {
				$this->variables[$variableName] = "~''";
			}
		}
	}
 /**
  * @see	\wcf\system\setup\IFileHandler::logFiles()
  */
 public function logFiles(array $files)
 {
     $packageID = $this->packageInstallation->getPackageID();
     // remove file extension
     foreach ($files as &$file) {
         $file = substr($file, 0, -4);
     }
     unset($file);
     // get existing templates
     $existingTemplates = $updateTemplateIDs = array();
     $sql = "SELECT\ttemplateName, templateID\n\t\t\tFROM\twcf" . WCF_N . "_template\n\t\t\tWHERE\tpackageID = ?\n\t\t\t\tAND application = ?\n\t\t\t\tAND templateGroupID IS NULL";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($packageID, $this->application));
     while ($row = $statement->fetchArray()) {
         $existingTemplates[$row['templateName']] = $row['templateID'];
     }
     // save new templates
     $sql = "INSERT INTO\twcf" . WCF_N . "_template\n\t\t\t\t\t(packageID, templateName, lastModificationTime, application)\n\t\t\tVALUES\t\t(?, ?, ?, ?)";
     $statement = WCF::getDB()->prepareStatement($sql);
     foreach ($files as $file) {
         if (isset($existingTemplates[$file])) {
             $updateTemplateIDs[] = $existingTemplates[$file];
             continue;
         }
         $statement->execute(array($packageID, $file, TIME_NOW, $this->application));
     }
     if (!empty($updateTemplateIDs)) {
         // update old templates
         $conditionBuilder = new PreparedStatementConditionBuilder();
         $conditionBuilder->add('templateID IN (?)', array($updateTemplateIDs));
         $sql = "UPDATE\twcf" . WCF_N . "_template\n\t\t\t\tSET\tlastModificationTime = ?\n\t\t\t\t" . $conditionBuilder;
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute(array_merge(array(TIME_NOW), $conditionBuilder->getParameters()));
     }
 }
 /**
  * @see	\wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
  */
 protected function rebuild(array $parameters)
 {
     $data = array();
     // number of entry
     $sql = "SELECT\tCOUNT(*) AS count\n\t\t\tFROM\tlinklist" . WCF_N . "_entry";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $data['entries'] = $statement->fetchColumn();
     // number of comments
     $sql = "SELECT\tSUM(comments) AS count\n\t\t\tFROM\tlinklist" . WCF_N . "_entry\n\t\t\tWHERE\tcomments > 0";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $data['comments'] = $statement->fetchColumn();
     // number of authors
     $sql = "SELECT\tCOUNT(DISTINCT userID) AS count\n\t\t\tFROM\tlinklist" . WCF_N . "_entry";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $data['authors'] = $statement->fetchColumn();
     // entries per day
     $days = ceil((TIME_NOW - LINKLIST_INSTALL_DATE) / 86400);
     if ($days <= 0) {
         $days = 1;
     }
     $data['entriesPerDay'] = $data['entries'] / $days;
     return $data;
 }
 /**
  * @see	\wcf\system\faker\IFaker::fake()
  */
 public function fake()
 {
     $likeableObjectID = $this->getLikeableObjectID();
     $likeableObject = $this->objectTypeProvider->getObjectByID($likeableObjectID);
     $likeableObject->setObjectType($this->objectType);
     $sql = "SELECT\t\tuserID, username\n\t\t\tFROM\t\twcf" . WCF_N . "_user\n\t\t\tORDER BY\tuserID ASC";
     $statement = WCF::getDB()->prepareStatement($sql, 1, $this->generator->numberBetween(0, $this->userCount - 1));
     $statement->execute();
     $liker = $statement->fetchObject('\\wcf\\data\\user\\User');
     if (isset($this->parameters['likeValue'])) {
         switch ($this->parameters['likeValue']) {
             case '+':
                 $value = \wcf\data\like\Like::LIKE;
                 break;
             case '-':
                 $value = \wcf\data\like\Like::DISLIKE;
                 break;
             case '+-':
                 if ($this->generator->boolean) {
                     $value = \wcf\data\like\Like::LIKE;
                 } else {
                     $value = \wcf\data\like\Like::DISLIKE;
                 }
         }
     } else {
         $value = \wcf\data\like\Like::LIKE;
     }
     \wcf\system\like\LikeHandler::getInstance()->like($likeableObject, $liker, $value);
 }
 protected function getTopOptionCategories($packageID)
 {
     // get all option categories and filter categories with low priority
     $sql = "SELECT\t\tcategoryName, categoryID \n\t\t\tFROM\t\twcf" . WCF_N . "_option_category option_category\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package_dependency package_dependency\n\t\t\tON\t\t(package_dependency.dependency = option_category.packageID)\n\t\t\tWHERE \t\tpackage_dependency.packageID = ?\n\t\t\tORDER BY\tpackage_dependency.priority ASC";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($packageID));
     $optionCategories = array();
     while ($row = $statement->fetchArray()) {
         $optionCategories[$row['categoryName']] = $row['categoryID'];
     }
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("categoryID IN (?)", array($optionCategories));
     $statementParameters = $conditions->getParameters();
     array_unshift($statementParameters, $packageID);
     $sql = "SELECT \t\tcategoryID, parentCategoryName, categoryName,\n\t\t\t\t\t(\n\t\t\t\t\t\tSELECT COUNT(*) FROM wcf" . WCF_N . "_option WHERE categoryName = category.categoryName AND packageID IN (\n\t\t\t\t\t\t\tSELECT dependency FROM wcf" . WCF_N . "_package_dependency WHERE packageID = ?\n\t\t\t\t\t\t)\n\t\t\t\t\t) AS count\n\t\t\tFROM\t\twcf" . WCF_N . "_option_category category\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($statementParameters);
     while ($row = $statement->fetchArray()) {
         if (!isset($this->optionCategoryStructure[$row['parentCategoryName']])) {
             $this->optionCategoryStructure[$row['parentCategoryName']] = array();
         }
         $this->optionCategoryStructure[$row['parentCategoryName']][] = $row;
     }
     $topOptionCategories = array();
     foreach ($this->optionCategoryStructure[''] as $optionCategory) {
         $count = $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);
         if ($count > 0) {
             $topOptionCategories[] = $optionCategory['categoryID'];
         }
     }
     return $topOptionCategories;
 }
 /**
  * @see	\wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
  */
 protected function rebuild(array $parameters)
 {
     $attributes = array();
     $data = array('bbcodes' => array(), 'highlighters' => array());
     // get attributes
     $sql = "SELECT\t\tattribute.*, bbcode.bbcodeTag\n\t\t\tFROM\t\twcf" . WCF_N . "_bbcode_attribute attribute\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_bbcode bbcode\n\t\t\tON\t\t(bbcode.bbcodeID = attribute.bbcodeID)\n\t\t\tWHERE\t\tbbcode.isDisabled = 0\n\t\t\tORDER BY\tattribute.attributeNo";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     while ($row = $statement->fetchArray()) {
         if (!isset($attributes[$row['bbcodeTag']])) {
             $attributes[$row['bbcodeTag']] = array();
         }
         $attributes[$row['bbcodeTag']][$row['attributeNo']] = new BBCodeAttribute(null, $row);
     }
     // get bbcodes
     $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_bbcode\n\t\t\tWHERE\tisDisabled = 0";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     while ($row = $statement->fetchArray()) {
         $row['attributes'] = isset($attributes[$row['bbcodeTag']]) ? $attributes[$row['bbcodeTag']] : array();
         $data['bbcodes'][$row['bbcodeTag']] = new BBCode(null, $row);
     }
     // get code highlighters
     $highlighters = glob(WCF_DIR . 'lib/system/bbcode/highlighter/*.class.php');
     if (is_array($highlighters)) {
         foreach ($highlighters as $highlighter) {
             if (preg_match('~\\/([a-zA-Z]+)Highlighter\\.class\\.php$~', $highlighter, $matches)) {
                 $data['highlighters'][] = strtolower($matches[1]);
             }
         }
     }
     return $data;
 }
 /**
  * @see	\wcf\system\moderation\queue\IModerationQueueHandler::assignQueues()
  */
 public function assignQueues(array $queues)
 {
     $assignments = array();
     // read comments and responses
     $responseIDs = array();
     foreach ($queues as $queue) {
         $responseIDs[] = $queue->objectID;
     }
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("comment_response.responseID IN (?)", array($responseIDs));
     $sql = "SELECT\t\tcomment_response.responseID, comment.commentID, comment.objectTypeID, comment.objectID\n\t\t\tFROM\t\twcf" . WCF_N . "_comment_response comment_response\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_comment comment\n\t\t\tON\t\t(comment.commentID = comment_response.commentID)\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($conditions->getParameters());
     $comments = $responses = array();
     while ($row = $statement->fetchArray()) {
         $comments[$row['commentID']] = new Comment(null, $row);
         $responses[$row['responseID']] = new CommentResponse(null, $row);
     }
     $orphanedQueueIDs = array();
     foreach ($queues as $queue) {
         $assignUser = false;
         if (!isset($responses[$queue->objectID]) || !isset($comments[$responses[$queue->objectID]->commentID])) {
             $orphanedQueueIDs[] = $queue->queueID;
             continue;
         }
         $comment = $comments[$responses[$queue->objectID]->commentID];
         if ($this->getCommentManager($comment)->canModerate($comment->objectTypeID, $comment->objectID)) {
             $assignUser = true;
         }
         $assignments[$queue->queueID] = $assignUser;
     }
     ModerationQueueManager::getInstance()->removeOrphans($orphanedQueueIDs);
     ModerationQueueManager::getInstance()->setAssignment($assignments);
 }
	/**
	 * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
	 */
	public function install() {
		parent::install();
		
		// get installation path of package
		$sql = "SELECT	packageDir
			FROM	wcf".WCF_N."_package
			WHERE	packageID = ?";
		$statement = WCF::getDB()->prepareStatement($sql);
		$statement->execute(array($this->installation->getPackageID()));
		$packageDir = $statement->fetchArray();
		$packageDir = $packageDir['packageDir'];
		
		// get relative path of script
		$path = FileUtil::getRealPath(WCF_DIR.$packageDir);
		
		// reset WCF cache
		CacheHandler::getInstance()->flushAll();
		
		// run script
		$this->run($path.$this->instruction['value']);
		
		// delete script
		if (@unlink($path.$this->instruction['value'])) {
			// delete file log entry
			$sql = "DELETE FROM	wcf".WCF_N."_package_installation_file_log
				WHERE		packageID = ?
						AND filename = ?";
			$statement = WCF::getDB()->prepareStatement($sql);
			$statement->execute(array(
				$this->installation->getPackageID(),
				$this->instruction['value']
			));
		}
	}
 /**
  * @see	\wcf\system\event\listener\IParameterizedEventListener::execute()
  */
 public function execute($eventObj, $className, $eventName, array &$parameters)
 {
     // conversation
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("userID IN (?)", array($eventObj->mergedUserIDs));
     $sql = "UPDATE\twcf" . WCF_N . "_conversation\n\t\t\tSET\tuserID = ?\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array_merge(array($eventObj->destinationUserID), $conditions->getParameters()));
     // conversation_to_user
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("participantID IN (?)", array($eventObj->mergedUserIDs));
     $sql = "UPDATE IGNORE\twcf" . WCF_N . "_conversation_to_user\n\t\t\tSET\t\tparticipantID = ?\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array_merge(array($eventObj->destinationUserID), $conditions->getParameters()));
     // conversation_message
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("userID IN (?)", array($eventObj->mergedUserIDs));
     $sql = "UPDATE\twcf" . WCF_N . "_conversation_message\n\t\t\tSET\tuserID = ?\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array_merge(array($eventObj->destinationUserID), $conditions->getParameters()));
     // conversation_label
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("userID IN (?)", array($eventObj->mergedUserIDs));
     $sql = "UPDATE\twcf" . WCF_N . "_conversation_label\n\t\t\tSET\tuserID = ?\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array_merge(array($eventObj->destinationUserID), $conditions->getParameters()));
 }
 /**
  * @see	\wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
  */
 protected function rebuild(array $parameters)
 {
     $data = array();
     // number of entry
     $sql = "SELECT\tCOUNT(*) AS count,\n\t\t\t\tSUM(downloads) AS downloads\n\t\t\tFROM\tfilebase" . WCF_N . "_entry";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $row = $statement->fetchArray();
     $data['entries'] = $row['count'];
     $data['downloads'] = $row['downloads'];
     // number of comments
     $sql = "SELECT\tSUM(comments) AS count\n\t\t\tFROM\tfilebase" . WCF_N . "_entry\n\t\t\tWHERE\tcomments > 0";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $data['comments'] = $statement->fetchColumn();
     // number of authors
     $sql = "SELECT\tCOUNT(DISTINCT userID) AS count\n\t\t\tFROM\tfilebase" . WCF_N . "_entry";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $data['authors'] = $statement->fetchColumn();
     // files + total size
     $sql = "SELECT\tCOUNT(*) AS files,\n\t\t\t\tSUM(filesize) AS size\n\t\t\tFROM\tfilebase" . WCF_N . "_file";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $row = $statement->fetchArray();
     $data['files'] = $row['files'];
     $data['size'] = $row['size'];
     // downloads per day
     $days = ceil((TIME_NOW - FILEBASE_INSTALL_DATE) / 86400);
     if ($days <= 0) {
         $days = 1;
     }
     $data['downloadsPerDay'] = $data['downloads'] / $days;
     return $data;
 }
	/**
	 * @see	wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
	 */
	public function rebuild(array $parameters) {	
		// get object types
		$objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.versionableObject');
		
		$data = array(
			'versions' => array(),
			'versionIDs' => array()
		);	
		
		foreach ($objectTypes as $objectTypeID => $objectType) {
			$processorObject = $objectType->getProcessor();
			
			$sql = "SELECT	* 
				FROM	".$processorObject::getDatabaseVersionTableName();
			$statement = WCF::getDB()->prepareStatement($sql);
			$statement->execute(array());
			
			while ($row = $statement->fetchArray()) {
				$object = new $objectType->className(null, $row);
				$data['versions'][$objectTypeID][$object->{$processorObject::getDatabaseIndexName()}] = $object;
				$data['versionIDs'][$objectTypeID][$object->{$processorObject::getDatabaseIndexName()}][] = $object->{$processorObject::getDatabaseVersionTableIndexName()};
			}
		}
		
		return $data;
	}
 /**
  * Returns the number of authentication failures for given user account.
  * 
  * @param	integer		$userID
  * @return	boolean
  */
 public static function countUserFailures($userID)
 {
     $sql = "SELECT\tCOUNT(*) AS count\n\t\t\tFROM\twcf" . WCF_N . "_user_authentication_failure\n\t\t\tWHERE\tuserID = ?\n\t\t\t\tAND time > ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($userID, TIME_NOW - USER_AUTHENTICATION_FAILURE_TIMEOUT));
     return $statement->fetchColumn();
 }
 /**
  * @see	\wcf\system\cronjob\ICronjob::execute()
  */
 public function execute(Cronjob $cronjob)
 {
     parent::execute($cronjob);
     $sql = "UPDATE\twcf" . WCF_N . "_user user_table,\n\t\t\t\twcf" . WCF_N . "_session session\n\t\t\tSET\tuser_table.lastActivityTime = session.lastActivityTime\n\t\t\tWHERE\tuser_table.userID = session.userID\n\t\t\t\tAND session.userID <> 0";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
 }
 /**
  * Fetches the information of the latest edit.
  * 
  * @see	\wcf\data\DatabaseObjectDecorator::__construct()
  */
 public function __construct(DatabaseObject $object)
 {
     parent::__construct($object);
     $objectTypeID = ObjectTypeCache::getInstance()->getObjectTypeIDByName('com.woltlab.wcf.modifiableContent', 'de.incendium.cms.news.entry');
     $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_modification_log\n\t\t\tWHERE\t\tobjectTypeID = ?\n\t\t\t\tAND\tobjectID = ?\n\t\t\t\tAND\taction = ?\n\t\t\tORDER BY time DESC";
     $statement = WCF::getDB()->prepareStatement($sql, 1);
     $statement->execute(array($objectTypeID, $this->getDecoratedObject()->entryID, 'edit'));
     $row = $statement->fetchArray();
     if ($row) {
         $this->userID = $row['userID'];
         $this->username = $row['username'];
         $this->time = $row['time'];
         $additionalData = @unserialize($row['additionalData']);
         if (isset($additionalData['reason'])) {
             $this->reason = $additionalData['reason'];
         } else {
             $this->reason = '';
         }
     } else {
         $this->userID = $this->getDecoratedObject()->getUserID();
         $this->username = $this->getDecoratedObject()->getUsername();
         $this->time = $this->getDecoratedObject()->getTime();
         $this->reason = '';
     }
 }
 /**
  * @inheritDoc
  */
 public function getOutstandingItemCount($objectID = null)
 {
     if ($this->notifications === null) {
         $this->notifications = 0;
         if (WCF::getUser()->userID) {
             $data = UserStorageHandler::getInstance()->getField('filebaseUnreaWatchedEntries');
             // cache does not exist or is outdated
             if ($data === null) {
                 $categoryIDs = FilebaseCategory::getAccessibleCategoryIDs();
                 if (!empty($categoryIDs)) {
                     $objectTypeID = UserObjectWatchHandler::getInstance()->getObjectTypeID('de.incendium.filebase.entry');
                     $conditionBuilder = new PreparedStatementConditionBuilder();
                     $conditionBuilder->add('user_object_watch.objectTypeID = ?', array($objectTypeID));
                     $conditionBuilder->add('user_object_watch.userID = ?', array(WCF::getUser()->userID));
                     $conditionBuilder->add('entry.lastChangeTime > ?', array(VisitTracker::getInstance()->getVisitTime('de.incendium.filebase.entry')));
                     $conditionBuilder->add('entry.entryID IN (SELECT entryID FROM filebase' . WCF_N . '_entry_to_category WHERE categoryID IN (?))', array($categoryIDs));
                     $conditionBuilder->add('entry.isDeleted = 0 AND entry.isDisabled = 0');
                     $conditionBuilder->add('(entry.lastChangeTime > tracked_file_visit.visitTime OR tracked_file_visit.visitTime IS NULL)');
                     $sql = "SELECT        COUNT(*) AS count\n                            FROM        wcf" . WCF_N . "_user_object_watch user_object_watch\n                            LEFT JOIN    filebase" . WCF_N . "_entry entry\n                            ON        (entry.entryID = user_object_watch.objectID)\n                            LEFT JOIN    wcf" . WCF_N . "_tracked_visit tracked_file_visit\n                            ON        (tracked_file_visit.objectTypeID = " . VisitTracker::getInstance()->getObjectTypeID('de.incendium.filebase.entry') . " AND tracked_file_visit.objectID = entry.entryID AND tracked_file_visit.userID = " . WCF::getUser()->userID . ")\n                            " . $conditionBuilder;
                     $statement = WCF::getDB()->prepareStatement($sql);
                     $statement->execute($conditionBuilder->getParameters());
                     $row = $statement->fetchArray();
                     $this->notifications = $row['count'];
                 }
                 // update storage data
                 UserStorageHandler::getInstance()->update(WCF::getUser()->userID, 'filebaseUnreadWatchedEntries', $this->notifications);
             } else {
                 $this->notifications = $data;
             }
         }
     }
     return $this->notifications;
 }
 /**
  * @see	\wcf\system\event\listener\IParameterizedEventListener::execute()
  */
 public function execute($eventObj, $className, $eventName, array &$parameters)
 {
     if (WCF::getUser()->userID && WCF::getSession()->getPermission('admin.general.canUseAcp') && !defined(get_class($eventObj) . '::DO_NOT_LOG')) {
         // try to find existing session log
         $sql = "SELECT\tsessionLogID\n\t\t\t\tFROM\twcf" . WCF_N . "_acp_session_log\n\t\t\t\tWHERE\tsessionID = ?\n\t\t\t\t\tAND lastActivityTime >= ?";
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute(array(WCF::getSession()->sessionID, TIME_NOW - SESSION_TIMEOUT));
         $row = $statement->fetchArray();
         if (!empty($row['sessionLogID'])) {
             $sessionLogID = $row['sessionLogID'];
             $sessionLogEditor = new ACPSessionLogEditor(new ACPSessionLog(null, array('sessionLogID' => $sessionLogID)));
             $sessionLogEditor->update(array('lastActivityTime' => TIME_NOW));
         } else {
             // create new session log
             $sessionLog = ACPSessionLogEditor::create(array('sessionID' => WCF::getSession()->sessionID, 'userID' => WCF::getUser()->userID, 'ipAddress' => UserUtil::getIpAddress(), 'hostname' => @gethostbyaddr(WCF::getSession()->ipAddress), 'userAgent' => WCF::getSession()->userAgent, 'time' => TIME_NOW, 'lastActivityTime' => TIME_NOW));
             $sessionLogID = $sessionLog->sessionLogID;
         }
         // format request uri
         $requestURI = WCF::getSession()->requestURI;
         // remove directories
         $URIComponents = explode('/', $requestURI);
         $requestURI = array_pop($URIComponents);
         // remove session url
         $requestURI = preg_replace('/(?:\\?|&)s=[a-f0-9]{40}/', '', $requestURI);
         // save access
         ACPSessionAccessLogEditor::create(array('sessionLogID' => $sessionLogID, 'ipAddress' => UserUtil::getIpAddress(), 'time' => TIME_NOW, 'requestURI' => $requestURI, 'requestMethod' => WCF::getSession()->requestMethod, 'className' => get_class($eventObj)));
     }
 }
 /**
  * Counts the total number of rows.
  * 
  * @param	integer		$date
  * @param	string		$tableName
  * @param	string		$dateColumnName
  * @return	integer
  */
 protected function getTotal($date, $tableName, $dateColumnName)
 {
     $sql = "SELECT\tCOUNT(*) AS count\n\t\t\tFROM\t" . $tableName . "\n\t\t\tWHERE\t" . $dateColumnName . " < ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($date + 86400));
     return $statement->fetchColumn();
 }
 /**
  * Updates the values of the given options.
  * 
  * @param	array		$options	id to value
  */
 public static function updateAll(array $options)
 {
     $sql = "SELECT\toptionID, optionValue\n\t\t\tFROM\twcf" . WCF_N . "_option\n\t\t\tWHERE\toptionName = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array('cache_source_type'));
     $row = $statement->fetchArray();
     $sql = "UPDATE\twcf" . WCF_N . "_option\n\t\t\tSET\toptionValue = ?\n\t\t\tWHERE\toptionID = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $flushCache = false;
     WCF::getDB()->beginTransaction();
     foreach ($options as $id => $value) {
         if ($id == $row['optionID'] && ($value != $row['optionValue'] || $value != CACHE_SOURCE_TYPE)) {
             $flushCache = true;
         }
         $statement->execute(array($value, $id));
     }
     WCF::getDB()->commitTransaction();
     // force a cache reset if options were changed
     self::resetCache();
     // flush entire cache, as the CacheSource was changed
     if ($flushCache) {
         // flush caches (in case register_shutdown_function gets not properly called)
         CacheHandler::getInstance()->flushAll();
         // flush cache before finishing request to flush caches created after this was executed
         register_shutdown_function(function () {
             CacheHandler::getInstance()->flushAll();
         });
     }
 }
 /**
  * @see	\wcf\page\IPage::readData()
  */
 public function readData()
 {
     parent::readData();
     // get object types
     $this->objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.rebuildData');
     // sort object types
     uasort($this->objectTypes, function ($a, $b) {
         $niceValueA = $a->nicevalue ?: 0;
         $niceValueB = $b->nicevalue ?: 0;
         if ($niceValueA < $niceValueB) {
             return -1;
         } else {
             if ($niceValueA > $niceValueB) {
                 return 1;
             }
         }
         return 0;
     });
     $sql = "SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     $row = $statement->fetchArray();
     if ($row && $row['Value'] == 1) {
         $this->showInnoDBWarning = true;
     }
 }
	/**
	 * @see	wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
	 */
	public function uninstall() {
		// create ACP-templates list
		$templates = array();
		
		// get ACP-templates from log
		$sql = "SELECT	*
			FROM	wcf".WCF_N."_acp_template
			WHERE	packageID = ?";
		$statement = WCF::getDB()->prepareStatement($sql);
		$statement->execute(array($this->installation->getPackageID()));
		while ($row = $statement->fetchArray()) {
			// store acp template with suffix (_$packageID)
			$templates[] = 'acp/templates/'.$row['templateName'].'.tpl';
		}
		
		if (!empty($templates)) {
			// delete template files
			$packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$this->installation->getPackage()->packageDir));
			$deleteEmptyDirectories = $this->installation->getPackage()->isApplication;
			$this->installation->deleteFiles($packageDir, $templates, false, $deleteEmptyDirectories);
			
			// delete log entries
			parent::uninstall();
		}
	}
 /**
  * @see	\wcf\system\search\acp\IACPSearchResultProvider::search()
  */
 public function search($query)
 {
     if (!WCF::getSession()->getPermission('admin.system.package.canUpdatePackage') && !WCF::getSession()->getPermission('admin.system.package.canUninstallPackage')) {
         return array();
     }
     $results = array();
     // search by language item
     $conditions = new PreparedStatementConditionBuilder();
     $conditions->add("languageID = ?", array(WCF::getLanguage()->languageID));
     $conditions->add("languageItem LIKE ?", array('wcf.acp.package.packageName.package%'));
     $conditions->add("languageItemValue LIKE ?", array('%' . $query . '%'));
     $sql = "SELECT\t\tlanguageItem\n\t\t\tFROM\t\twcf" . WCF_N . "_language_item\n\t\t\t" . $conditions;
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute($conditions->getParameters());
     $packageIDs = array();
     while ($row = $statement->fetchArray()) {
         $packageIDs[] = str_replace('wcf.acp.package.packageName.package', '', $row['languageItem']);
     }
     $conditions = new PreparedStatementConditionBuilder(false);
     if (!empty($packageIDs)) {
         $conditions->add("packageID IN (?)", array($packageIDs));
     }
     $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_package\n\t\t\tWHERE\tpackageName LIKE ?\n\t\t\t\tOR package LIKE ?\n\t\t\t\t" . (count($conditions->getParameters()) ? "OR " . $conditions : "");
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array_merge(array($query . '%', $query . '%'), $conditions->getParameters()));
     while ($package = $statement->fetchObject('wcf\\data\\package\\Package')) {
         $results[] = new ACPSearchResult($package->getName(), LinkHandler::getInstance()->getLink('Package', array('id' => $package->packageID, 'title' => $package->getName())));
     }
     return $results;
 }