Commit | Line | Data |
---|---|---|
11ade432 AE |
1 | <?php |
2 | namespace wcf\system\package; | |
04727c8b | 3 | use wcf\data\package\Package; |
11ade432 | 4 | use wcf\system\database\util\PreparedStatementConditionBuilder; |
04727c8b | 5 | use wcf\system\exception\SystemException; |
11ade432 AE |
6 | use wcf\system\WCF; |
7 | ||
8 | /** | |
a17de04e | 9 | * File handler implementation for the installation of regular files. |
11ade432 | 10 | * |
04727c8b MS |
11 | * @author Matthias Schmidt, Marcel Werk |
12 | * @copyright 2001-2013 WoltLab GmbH | |
11ade432 AE |
13 | * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> |
14 | * @package com.woltlab.wcf | |
15 | * @subpackage system.package | |
9f959ced | 16 | * @category Community Framework |
11ade432 AE |
17 | */ |
18 | class FilesFileHandler extends PackageInstallationFileHandler { | |
19 | /** | |
0ad90fc3 | 20 | * @see \wcf\system\setup\IFileHandler::checkFiles() |
11ade432 AE |
21 | */ |
22 | public function checkFiles(array $files) { | |
23 | if ($this->packageInstallation->getPackage()->package != 'com.woltlab.wcf') { | |
24 | if (!empty($files)) { | |
04727c8b MS |
25 | // get registered files of other packages for the |
26 | // same application | |
11ade432 | 27 | $conditions = new PreparedStatementConditionBuilder(); |
04727c8b MS |
28 | $conditions->add('packageID <> ?', array($this->packageInstallation->getPackageID())); |
29 | $conditions->add('filename IN (?)', array($files)); | |
30 | $conditions->add('application = ?', array($this->application)); | |
11ade432 | 31 | |
04727c8b MS |
32 | $sql = "SELECT filename, packageID |
33 | FROM wcf".WCF_N."_package_installation_file_log | |
11ade432 AE |
34 | ".$conditions; |
35 | $statement = WCF::getDB()->prepareStatement($sql); | |
36 | $statement->execute($conditions->getParameters()); | |
37 | $lockedFiles = array(); | |
38 | while ($row = $statement->fetchArray()) { | |
04727c8b | 39 | $lockedFiles[$row['filename']] = $row['packageID']; |
11ade432 AE |
40 | } |
41 | ||
42 | // check delivered files | |
15fa2802 | 43 | if (!empty($lockedFiles)) { |
11ade432 | 44 | foreach ($files as $key => $file) { |
04727c8b MS |
45 | if (isset($lockedFiles[$file])) { |
46 | $owningPackage = new Package($lockedFiles[$file]); | |
47 | ||
48 | throw new SystemException("A package can't overwrite files from other packages. Only an update from the package which owns the file can do that. (Package '".$this->packageInstallation->getPackage()->package."' tries to overwrite file '".$file."', which is owned by package '".$owningPackage->package."')"); | |
11ade432 AE |
49 | } |
50 | } | |
51 | } | |
52 | } | |
53 | } | |
54 | } | |
55 | ||
56 | /** | |
0ad90fc3 | 57 | * @see \wcf\system\setup\IFileHandler::logFiles() |
11ade432 AE |
58 | */ |
59 | public function logFiles(array $files) { | |
60 | if (empty($files)) { | |
61 | return; | |
62 | } | |
63 | ||
52e3cc87 | 64 | $sql = "INSERT IGNORE INTO wcf".WCF_N."_package_installation_file_log |
1be29799 | 65 | (packageID, filename, application) |
52e3cc87 AE |
66 | VALUES (?, ?, ?)"; |
67 | $statement = WCF::getDB()->prepareStatement($sql); | |
68 | ||
69 | WCF::getDB()->beginTransaction(); | |
70 | foreach ($files as $file) { | |
71 | $statement->execute(array( | |
72 | $this->packageInstallation->getPackageID(), | |
73 | $file, | |
74 | $this->application | |
75 | )); | |
11ade432 | 76 | } |
52e3cc87 | 77 | WCF::getDB()->commitTransaction(); |
11ade432 AE |
78 | } |
79 | } |