From a93b160e72731d72e58a13052c1b6b83b089552a Mon Sep 17 00:00:00 2001 From: Matthias Schmidt Date: Mon, 20 May 2013 11:44:31 +0200 Subject: [PATCH] Fixes handling of requirements during package update When a package is updated, the requirements of the current version are deleted first and replaced by the new ones. This way, it's ensured that packages the current version requires and which the updated version doesn't require anymore, are properly handled [cf. WCF 1.1]. Fixes #1286 --- .../PackageInstallationDispatcher.class.php | 68 ++++++++----------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php index 486705b80c..663081bd0b 100644 --- a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php +++ b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php @@ -274,25 +274,11 @@ class PackageInstallationDispatcher { $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->queue->packageID)); - // insert requirements and dependencies - $requirements = $this->getArchive()->getAllExistingRequirements(); - if (!empty($requirements)) { - $sql = "INSERT IGNORE INTO wcf".WCF_N."_package_requirement - (packageID, requirement) - VALUES (?, ?)"; - $statement = WCF::getDB()->prepareStatement($sql); - - foreach ($requirements as $identifier => $possibleRequirements) { - if (count($possibleRequirements) == 1) { - $requirement = array_shift($possibleRequirements); - } - else { - $requirement = $possibleRequirements[$this->selectedRequirements[$identifier]]; - } - - $statement->execute(array($this->queue->packageID, $requirement['packageID'])); - } - } + // delete old requirements and dependencies + $sql = "DELETE FROM wcf".WCF_N."_package_requirement + WHERE packageID = ?"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array($this->queue->packageID)); } else { // create package entry @@ -304,26 +290,6 @@ class PackageInstallationDispatcher { 'packageID' => $package->packageID )); - // insert requirements and dependencies - $requirements = $this->getArchive()->getAllExistingRequirements(); - if (!empty($requirements)) { - $sql = "INSERT INTO wcf".WCF_N."_package_requirement - (packageID, requirement) - VALUES (?, ?)"; - $statement = WCF::getDB()->prepareStatement($sql); - - foreach ($requirements as $identifier => $possibleRequirements) { - if (count($possibleRequirements) == 1) { - $requirement = array_shift($possibleRequirements); - } - else { - $requirement = $possibleRequirements[$this->selectedRequirements[$identifier]]; - } - - $statement->execute(array($package->packageID, $requirement['packageID'])); - } - } - // reload queue $this->queue = new PackageInstallationQueue($this->queue->queueID); $this->package = null; @@ -346,8 +312,8 @@ class PackageInstallationDispatcher { // save excluded packages if (count($this->getArchive()->getExcludedPackages())) { $sql = "INSERT INTO wcf".WCF_N."_package_exclusion - (packageID, excludedPackage, excludedPackageVersion) - VALUES (?, ?, ?)"; + (packageID, excludedPackage, excludedPackageVersion) + VALUES (?, ?, ?)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($this->getArchive()->getExcludedPackages() as $excludedPackage) { @@ -355,6 +321,26 @@ class PackageInstallationDispatcher { } } + // insert requirements and dependencies + $requirements = $this->getArchive()->getAllExistingRequirements(); + if (!empty($requirements)) { + $sql = "INSERT INTO wcf".WCF_N."_package_requirement + (packageID, requirement) + VALUES (?, ?)"; + $statement = WCF::getDB()->prepareStatement($sql); + + foreach ($requirements as $identifier => $possibleRequirements) { + if (count($possibleRequirements) == 1) { + $requirement = array_shift($possibleRequirements); + } + else { + $requirement = $possibleRequirements[$this->selectedRequirements[$identifier]]; + } + + $statement->execute(array($this->queue->packageID, $requirement['packageID'])); + } + } + if ($this->getPackage()->isApplication && $this->getPackage()->package != 'com.woltlab.wcf' && $this->getAction() == 'install') { if (empty($this->getPackage()->packageDir)) { $document = $this->promptPackageDir(); -- 2.20.1