From a44b2676b95f9f8901806bb6b0c9871471bf9b61 Mon Sep 17 00:00:00 2001
From: Helmut Hummel <typo3@helhum.io>
Date: Thu, 16 Dec 2021 13:42:48 +0100
Subject: [PATCH] [BUGFIX] Avoid select and therefore fetchFirstColumn() of
 doctrine/dbal
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Get rid of the select query entirely, which optimises
the task to only require one update query instead of
one select and possibly multiple update queries and
gets rid of doctrine version related incompatibilities
with fetching the select result.

Resolves: #96369
Related: #87162
Releases: main, 11.5, 10.4
Change-Id: I87b570f5efa3d77ed5f2c5fc0074e84bef4675a4
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/72693
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Reviewed-by: Helmut Hummel <typo3@helhum.io>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Helmut Hummel <typo3@helhum.io>
---
 .../Resource/MetaDataEventListener.php        | 40 ++++++-------------
 1 file changed, 13 insertions(+), 27 deletions(-)

diff --git a/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php b/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php
index d557d7f52c9d..fa9d3241f3cf 100644
--- a/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php
+++ b/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php
@@ -26,16 +26,16 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  */
 final class MetaDataEventListener
 {
-    private string $tableName = 'sys_file_metadata';
+    private const TABLE_NAME = 'sys_file_metadata';
 
     /**
-     * @throws \Doctrine\DBAL\Driver\Exception
+     * @param AfterFileMetaDataUpdatedEvent $event
      */
     public function afterFileMetaDataUpdated(AfterFileMetaDataUpdatedEvent $event): void
     {
         $record = $event->getRecord();
 
-        if ((int)$record['width'] <= 0 || (int)$record['height'] <= 0) {
+        if (($record['width'] ?? 0) <= 0 || ($record['height'] ?? 0) <= 0) {
             return;
         }
 
@@ -44,29 +44,15 @@ final class MetaDataEventListener
             'height' => (int)$record['height'],
         ];
 
-        // Fetch translated meta data records
-        $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($this->tableName);
-        $translations = $connection->select(
-            ['uid'],
-            $this->tableName,
-            ['file' => $event->getFileUid(), 'l10n_parent' => $event->getMetaDataUid()]
-        )->fetchFirstColumn();
-
-        if (empty($translations)) {
-            return;
-        }
-
-        // Update width and height of all translations
-        foreach ($translations as $uid) {
-            if ((int)$uid > 0) {
-                $connection->update(
-                    $this->tableName,
-                    $metaData,
-                    [
-                        'uid' => (int)$uid,
-                    ],
-                );
-            }
-        }
+        // Update translated meta data records
+        $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable(self::TABLE_NAME);
+        $connection->update(
+            self::TABLE_NAME,
+            $metaData,
+            [
+                'file' => $event->getFileUid(),
+                'l10n_parent' => $event->getMetaDataUid(),
+            ]
+        );
     }
 }
-- 
GitLab