From 7c17987d0c353c17f278f823ad7b31592fe8f354 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

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/+/72692
Tested-by: Helmut Hummel <typo3@helhum.io>
Tested-by: core-ci <typo3@b13.com>
Reviewed-by: Helmut Hummel <typo3@helhum.io>
---
 .../Resource/MetaDataEventListener.php        | 41 +++++++------------
 1 file changed, 15 insertions(+), 26 deletions(-)

diff --git a/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php b/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php
index 4a94048af194..fa9d3241f3cf 100644
--- a/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php
+++ b/typo3/sysext/core/Classes/Resource/MetaDataEventListener.php
@@ -26,13 +26,16 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  */
 final class MetaDataEventListener
 {
-    private $tableName = 'sys_file_metadata';
+    private const TABLE_NAME = 'sys_file_metadata';
 
+    /**
+     * @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;
         }
 
@@ -41,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