From 78143bc861273a5266011166772b317cfde4eb01 Mon Sep 17 00:00:00 2001 From: Matthias Schmidt Date: Sat, 27 Jul 2019 13:51:30 +0200 Subject: [PATCH] Revert "Optimize AbstractDatabaseObjectAction::update() for bulk processing" This reverts commit b50fd065f955d69708a8b093ea2d22717288cc53. Close #2995 --- .../AbstractDatabaseObjectAction.class.php | 56 ++----------------- 1 file changed, 6 insertions(+), 50 deletions(-) diff --git a/wcfsetup/install/files/lib/data/AbstractDatabaseObjectAction.class.php b/wcfsetup/install/files/lib/data/AbstractDatabaseObjectAction.class.php index 332b2955d4..1de72ecec4 100644 --- a/wcfsetup/install/files/lib/data/AbstractDatabaseObjectAction.class.php +++ b/wcfsetup/install/files/lib/data/AbstractDatabaseObjectAction.class.php @@ -363,60 +363,16 @@ abstract class AbstractDatabaseObjectAction implements IDatabaseObjectAction, ID $this->readObjects(); } - $tableName = call_user_func([$this->className, 'getDatabaseTableName']); - $indexName = call_user_func([$this->className, 'getDatabaseTableIndexName']); - - $itemsPerLoop = 1000; - $loopCount = ceil(count($this->objectIDs) / $itemsPerLoop); - - if (!empty($this->parameters['data'])) { - $updateSQL = ''; - $statementParameters = []; - foreach ($this->parameters['data'] as $key => $value) { - if (!empty($updateSQL)) $updateSQL .= ', '; - $updateSQL .= $key . ' = ?'; - $statementParameters[] = $value; - } - - WCF::getDB()->beginTransaction(); - for ($i = 0; $i < $loopCount; $i++) { - $batchObjectIDs = array_slice($this->objectIDs, $i * $itemsPerLoop, $itemsPerLoop); - - $conditionBuilder = new PreparedStatementConditionBuilder(); - $conditionBuilder->add($indexName . ' IN (?)', [$batchObjectIDs]); - - $sql = "UPDATE " . $tableName . " - SET " . $updateSQL . " - " . $conditionBuilder; - $statement = WCF::getDB()->prepareStatement($sql); - $statement->execute(array_merge($statementParameters, $conditionBuilder->getParameters())); + if (isset($this->parameters['data'])) { + foreach ($this->getObjects() as $object) { + $object->update($this->parameters['data']); } - WCF::getDB()->commitTransaction(); } - if (!empty($this->parameters['counters'])) { - $updateSQL = ''; - $statementParameters = []; - foreach ($this->parameters['counters'] as $key => $value) { - if (!empty($updateSQL)) $updateSQL .= ', '; - $updateSQL .= $key . ' = ' . $key . ' + ?'; - $statementParameters[] = $value; - } - - WCF::getDB()->beginTransaction(); - for ($i = 0; $i < $loopCount; $i++) { - $batchObjectIDs = array_slice($this->objectIDs, $i * $itemsPerLoop, $itemsPerLoop); - - $conditionBuilder = new PreparedStatementConditionBuilder(); - $conditionBuilder->add($indexName . ' IN (?)', [$batchObjectIDs]); - - $sql = "UPDATE " . $tableName . " - SET " . $updateSQL . " - " . $conditionBuilder; - $statement = WCF::getDB()->prepareStatement($sql); - $statement->execute(array_merge($statementParameters, $conditionBuilder->getParameters())); + if (isset($this->parameters['counters'])) { + foreach ($this->getObjects() as $object) { + $object->updateCounters($this->parameters['counters']); } - WCF::getDB()->commitTransaction(); } } -- 2.20.1