Added dependency injection for application groups
authorAlexander Ebert <ebert@woltlab.com>
Mon, 5 Nov 2012 16:21:26 +0000 (17:21 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Mon, 5 Nov 2012 16:21:26 +0000 (17:21 +0100)
wcfsetup/install/files/lib/data/application/ApplicationAction.class.php
wcfsetup/install/files/lib/data/package/Package.class.php

index 88f53ffafe400648616a3138757e9d440139004b..7a16d1880b2fb4de5c92eeb5b50784547078f0ef 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 namespace wcf\data\application;
 use wcf\data\AbstractDatabaseObjectAction;
+use wcf\data\package\Package;
 use wcf\data\package\PackageCache;
 use wcf\system\cache\CacheHandler;
 use wcf\system\WCF;
@@ -84,7 +85,7 @@ class ApplicationAction extends AbstractDatabaseObjectAction {
                }
                WCF::getDB()->commitTransaction();
                
-               $this->clearCache();
+               $this->rebuild();
        }
        
        /**
@@ -94,7 +95,7 @@ class ApplicationAction extends AbstractDatabaseObjectAction {
                if (empty($this->objects)) {
                        $this->readObjects();
                }
-               $this->clearCache();
+               
                $sql = "UPDATE  wcf".WCF_N."_application
                        SET     groupID = ?,
                                cookieDomain = domainName,
@@ -111,18 +112,22 @@ class ApplicationAction extends AbstractDatabaseObjectAction {
                }
                WCF::getDB()->commitTransaction();
                
-               $this->clearCache();
+               $this->rebuild();
        }
        
        /**
-        * Clears application cache.
+        * Rebuilds application cache and dependencies.
         */
-       protected function clearCache() {
+       protected function rebuild() {
                foreach ($this->objects as $application) {
+                       // reset cache
                        $directory = PackageCache::getInstance()->getPackage($application->packageID)->packageDir;
                        $directory = FileUtil::getRealPath(WCF_DIR.$directory);
                        
                        CacheHandler::getInstance()->clear($directory.'cache', '*.php');
+                       
+                       // rebuild dependencies
+                       Package::rebuildPackageDependencies($application->packageID);
                }
        }
 }
index 8aedb7863dc8fe32c53a975c6dc2cbaa93d69bb9..7c83387aee66242632fc91805fb2e52cb36871dd 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 namespace wcf\data\package;
 use wcf\data\DatabaseObject;
+use wcf\system\database\statement\PreparedStatement;
 use wcf\system\database\util\PreparedStatementConditionBuilder;
 use wcf\system\exception\SystemException;
 use wcf\system\io\File;
@@ -439,9 +440,14 @@ class Package extends DatabaseObject {
                        VALUES          (?, ?, ?)";
                $statement = WCF::getDB()->prepareStatement($sql);
                
-               $insertedDependencies = array();
+               $insertedDependencies = self::insertApplicationDependencies($packageID, $statement);
+               $shiftPriority = (empty($insertedDependencies)) ? false : true;
                foreach ($requirements as $dependency => $priority) {
-                       $statement->execute(array($packageID, $dependency, $priority));
+                       $statement->execute(array(
+                               $packageID,
+                               $dependency,
+                               ($shiftPriority ? ($priority + 1) : $priority)
+                       ));
                        
                        if (!isset($insertedDependencies[$packageID])) {
                                $insertedDependencies[$packageID] = array();
@@ -521,6 +527,40 @@ class Package extends DatabaseObject {
                }
        }
        
+       /**
+        * Inserts dependencies on applications within the same application group.
+        * 
+        * @param       integer                                                 $packageID
+        * @param       wcf\system\database\statement\PreparedStatement         $insertStatement
+        * @return      array<string>
+        */
+       protected static function insertApplicationDependencies($packageID, PreparedStatement $insertStatement) {
+               $insertedDependencies = array();
+               
+               // check for application group
+               $sql = "SELECT  groupID
+                       FROM    wcf".WCF_N."_application
+                       WHERE   packageID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array($packageID));
+               $row = $statement->fetchArray();
+               if ($row !== false && $row['groupID'] !== null) {
+                       // select application ids
+                       $sql = "SELECT  packageID
+                               FROM    wcf".WCF_N."_application
+                               WHERE   groupID = ?";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute(array($row['groupID']));
+                       while ($row = $statement->fetchArray()) {
+                               $insertStatement->execute(array(
+                                       $packageID,
+                                       $row['packageID'],
+                                       1
+                               ));
+                       }
+               }
+       }
+       
        /**
         * Writes the config.inc.php for an application.
         *