From 5e3a3dc5271887b7066f8e7798dc01c88c621537 Mon Sep 17 00:00:00 2001
From: Christian Kuhn <lolli@schwarzbu.ch>
Date: Sun, 21 Aug 2016 19:50:50 +0200
Subject: [PATCH] [TASK] Doctrine: Migrate exec_SELECTgetSingleRow

Change-Id: I5f1a284c34fe8a238838a7b2c5747746a9aee882
Resolves: #77561
Releases: master
Reviewed-on: https://review.typo3.org/49525
Tested-by: Bamboo TYPO3com <info@typo3.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
---
 .../Collection/AbstractRecordCollection.php   | 15 ++++---
 .../Collection/RecordCollectionRepository.php | 15 ++++---
 .../core/Classes/Resource/ResourceFactory.php | 22 ++++++---
 .../core/Classes/Resource/ResourceStorage.php |  9 +++-
 .../core/Classes/Utility/RootlineUtility.php  | 13 +++++-
 .../RecordCollectionRepositoryTest.php        | 45 -------------------
 .../Unit/Utility/RootlineUtilityTest.php      | 41 -----------------
 .../Classes/Domain/Record/AbstractRecord.php  | 11 ++++-
 8 files changed, 67 insertions(+), 104 deletions(-)

diff --git a/typo3/sysext/core/Classes/Collection/AbstractRecordCollection.php b/typo3/sysext/core/Classes/Collection/AbstractRecordCollection.php
index eefe9c643c52..3ce90c76ff2f 100644
--- a/typo3/sysext/core/Classes/Collection/AbstractRecordCollection.php
+++ b/typo3/sysext/core/Classes/Collection/AbstractRecordCollection.php
@@ -13,6 +13,9 @@ namespace TYPO3\CMS\Core\Collection;
  *
  * The TYPO3 project - inspiring people to share!
  */
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * Abstract implementation of a RecordCollection
@@ -326,11 +329,13 @@ abstract class AbstractRecordCollection implements RecordCollectionInterface, Pe
      */
     public static function load($id, $fillItems = false)
     {
-        $collectionRecord = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow(
-            '*',
-            static::$storageTableName,
-            'uid=' . (int)$id . \TYPO3\CMS\Backend\Utility\BackendUtility::deleteClause(static::$storageTableName)
-        );
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(static::$storageTableName);
+        $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+        $collectionRecord = $queryBuilder->select('*')
+            ->from(static::$storageTableName)
+            ->where($queryBuilder->expr()->eq('uid', (int)$id))
+            ->execute()
+            ->fetch();
         return self::create($collectionRecord, $fillItems);
     }
 
diff --git a/typo3/sysext/core/Classes/Collection/RecordCollectionRepository.php b/typo3/sysext/core/Classes/Collection/RecordCollectionRepository.php
index c5fc2183f27f..1752ba55deb5 100644
--- a/typo3/sysext/core/Classes/Collection/RecordCollectionRepository.php
+++ b/typo3/sysext/core/Classes/Collection/RecordCollectionRepository.php
@@ -15,6 +15,9 @@ namespace TYPO3\CMS\Core\Collection;
  */
 
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * Implements the repository for record collections.
@@ -52,11 +55,13 @@ class RecordCollectionRepository
     public function findByUid($uid)
     {
         $result = null;
-        $data = $this->getDatabaseConnection()->exec_SELECTgetSingleRow(
-            '*',
-            $this->table,
-            'uid=' . (int)$uid . BackendUtility::deleteClause($this->table)
-        );
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($this->table);
+        $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+        $data = $queryBuilder->select('*')
+            ->from($this->table)
+            ->where($queryBuilder->expr()->eq('uid', (int)$uid))
+            ->execute()
+            ->fetch();
         if (is_array($data)) {
             $result = $this->createDomainObject($data);
         }
diff --git a/typo3/sysext/core/Classes/Resource/ResourceFactory.php b/typo3/sysext/core/Classes/Resource/ResourceFactory.php
index cd858ba57b72..28d5162085df 100644
--- a/typo3/sysext/core/Classes/Resource/ResourceFactory.php
+++ b/typo3/sysext/core/Classes/Resource/ResourceFactory.php
@@ -15,7 +15,9 @@ namespace TYPO3\CMS\Core\Resource;
  */
 
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\DatabaseConnection;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Core\Resource\Index\FileIndexRepository;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Utility\MathUtility;
@@ -290,9 +292,14 @@ class ResourceFactory implements ResourceFactoryInterface, \TYPO3\CMS\Core\Singl
         if (!$this->collectionInstances[$uid]) {
             // Get mount data if not already supplied as argument to this function
             if (empty($recordData) || $recordData['uid'] !== $uid) {
-                /** @var $GLOBALS['TYPO3_DB'] \TYPO3\CMS\Core\Database\DatabaseConnection */
-                $recordData = $this->getDatabaseConnection()->exec_SELECTgetSingleRow('*', 'sys_file_collection', 'uid=' . (int)$uid . ' AND deleted=0');
-                if (!is_array($recordData)) {
+                $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_collection');
+                $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+                $recordData = $queryBuilder->select('*')
+                    ->from('sys_file_collection')
+                    ->where($queryBuilder->expr()->eq('uid', (int)$uid))
+                    ->execute()
+                    ->fetch();
+                if (empty($recordData)) {
                     throw new \InvalidArgumentException('No collection found for given UID: "' . $uid . '"', 1314085992);
                 }
             }
@@ -643,8 +650,13 @@ class ResourceFactory implements ResourceFactoryInterface, \TYPO3\CMS\Core\Singl
         } elseif (!$raw && is_object($GLOBALS['TSFE'])) {
             $fileReferenceData = $GLOBALS['TSFE']->sys_page->checkRecord('sys_file_reference', $uid);
         } else {
-            /** @var $GLOBALS['TYPO3_DB'] \TYPO3\CMS\Core\Database\DatabaseConnection */
-            $fileReferenceData = $this->getDatabaseConnection()->exec_SELECTgetSingleRow('*', 'sys_file_reference', 'uid=' . (int)$uid . ' AND deleted=0');
+            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_reference');
+            $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+            $fileReferenceData = $queryBuilder->select('*')
+                ->from('sys_file_reference')
+                ->where($queryBuilder->expr()->eq('uid', (int)$uid))
+                ->execute()
+                ->fetch();
         }
         return $fileReferenceData;
     }
diff --git a/typo3/sysext/core/Classes/Resource/ResourceStorage.php b/typo3/sysext/core/Classes/Resource/ResourceStorage.php
index 3589c133d4e4..31a487925546 100644
--- a/typo3/sysext/core/Classes/Resource/ResourceStorage.php
+++ b/typo3/sysext/core/Classes/Resource/ResourceStorage.php
@@ -14,6 +14,7 @@ namespace TYPO3\CMS\Core\Resource;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\DatabaseConnection;
 use TYPO3\CMS\Core\Registry;
 use TYPO3\CMS\Core\Resource\Exception\InvalidTargetFolderException;
@@ -399,7 +400,13 @@ class ResourceStorage implements ResourceStorageInterface
     {
         if ($this->getUid() > 0) {
             // @todo: move this to the storage repository
-            $this->getDatabaseConnection()->exec_UPDATEquery('sys_file_storage', 'uid=' . (int)$this->getUid(), array('is_online' => 0));
+            GeneralUtility::makeInstance(ConnectionPool::class)
+                ->getConnectionForTable('sys_file_storage')
+                ->update(
+                    'sys_file_storage',
+                    ['is_online' => 0],
+                    ['uid' => (int)$this->getUid()]
+                );
         }
         $this->storageRecord['is_online'] = 0;
         $this->isOnline = false;
diff --git a/typo3/sysext/core/Classes/Utility/RootlineUtility.php b/typo3/sysext/core/Classes/Utility/RootlineUtility.php
index cb58333e0cc5..caf41e3cc25d 100644
--- a/typo3/sysext/core/Classes/Utility/RootlineUtility.php
+++ b/typo3/sysext/core/Classes/Utility/RootlineUtility.php
@@ -14,6 +14,8 @@ namespace TYPO3\CMS\Core\Utility;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Frontend\Page\PageRepository;
 
 /**
@@ -244,7 +246,16 @@ class RootlineUtility
     {
         $currentCacheIdentifier = $this->getCacheIdentifier($uid);
         if (!isset(self::$pageRecordCache[$currentCacheIdentifier])) {
-            $row = $this->databaseConnection->exec_SELECTgetSingleRow(implode(',', self::$rootlineFields), 'pages', 'uid = ' . (int)$uid . ' AND pages.deleted = 0 AND pages.doktype <> ' . PageRepository::DOKTYPE_RECYCLER);
+            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
+            $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+            $row = $queryBuilder->select(...self::$rootlineFields)
+                ->from('pages')
+                ->where(
+                    $queryBuilder->expr()->eq('uid', (int)$uid),
+                    $queryBuilder->expr()->neq('doktype', (int)PageRepository::DOKTYPE_RECYCLER)
+                )
+                ->execute()
+                ->fetch();
             if (empty($row)) {
                 throw new \RuntimeException('Could not fetch page data for uid ' . $uid . '.', 1343589451);
             }
diff --git a/typo3/sysext/core/Tests/Unit/Collection/RecordCollectionRepositoryTest.php b/typo3/sysext/core/Tests/Unit/Collection/RecordCollectionRepositoryTest.php
index c6f842a781da..540365a922db 100644
--- a/typo3/sysext/core/Tests/Unit/Collection/RecordCollectionRepositoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Collection/RecordCollectionRepositoryTest.php
@@ -94,51 +94,6 @@ class RecordCollectionRepositoryTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
-    public function doesFindByUidReturnNull()
-    {
-        $testUid = rand(1, 1000);
-        $this->databaseMock->expects($this->once())->method('exec_SELECTgetSingleRow')->will($this->returnCallback(array($this, 'getSingleRowCallback')));
-        $this->getSingleRowCallbackReturnValue = null;
-        $object = $this->subject->findByUid($testUid);
-        $this->assertNull($object);
-    }
-
-    /**
-     * @test
-     */
-    public function doesFindByUidReturnObject()
-    {
-        $testUid = rand(1, 1000);
-        $this->databaseMock->expects($this->once())->method('exec_SELECTgetSingleRow')->will($this->returnCallback(array($this, 'getSingleRowCallback')));
-        $this->getSingleRowCallbackReturnValue = array(
-            'uid' => $testUid,
-            'type' => \TYPO3\CMS\Core\Collection\RecordCollectionRepository::TYPE_Static,
-            'table_name' => $this->testTableName
-        );
-        $object = $this->subject->findByUid($testUid);
-        $this->assertInstanceOf(\TYPO3\CMS\Core\Collection\StaticRecordCollection::class, $object);
-    }
-
-    /**
-     * @test
-     */
-    public function doesFindByUidThrowException()
-    {
-        $this->expectException(\RuntimeException::class);
-        $this->expectExceptionCode(1328646798);
-
-        $testUid = rand(1, 1000);
-        $this->databaseMock->expects($this->once())->method('exec_SELECTgetSingleRow')->will($this->returnCallback(array($this, 'getSingleRowCallback')));
-        $this->getSingleRowCallbackReturnValue = array(
-            'uid' => $testUid,
-            'type' => $this->getUniqueId('unknown')
-        );
-        $object = $this->subject->findByUid($testUid);
-    }
-
     /**
      * @test
      */
diff --git a/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php
index c015b173a7c8..6293b38d0ea4 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php
@@ -287,47 +287,6 @@ class RootlineUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
         $this->assertTrue($cacheFrontendMock->isValidEntryIdentifier($this->subject->getCacheIdentifier()));
     }
 
-    /**
-     * @test
-     */
-    public function getRecordArrayFetchesTranslationWhenLanguageIdIsSet()
-    {
-        $pageData = array(
-            'uid' => 1,
-            'title' => 'Original',
-        );
-        $pageDataTranslated = array(
-            'uid' => 1,
-            'title' => 'Translated',
-            '_PAGES_OVERLAY_UID' => '2',
-        );
-
-        $this->subject
-            ->expects($this->any())
-            ->method('enrichWithRelationFields')
-            ->with(2, $pageDataTranslated)
-            ->will($this->returnArgument(1));
-
-        $databaseConnectionMock = $this->createMock(\TYPO3\CMS\Core\Database\DatabaseConnection::class);
-        $databaseConnectionMock
-            ->expects($this->once())
-            ->method('exec_SELECTgetSingleRow')
-            ->will(
-                $this->returnValue($pageData)
-            );
-        $this->subject->_set('databaseConnection',
-            $databaseConnectionMock
-        );
-
-        $this->pageContextMock
-                ->expects($this->any())
-                ->method('getPageOverlay')
-                ->will($this->returnValue($pageDataTranslated));
-
-        $this->subject->_set('languageUid', 1);
-        $this->assertSame($pageDataTranslated, $this->subject->_call('getRecordArray', 1));
-    }
-
     /**
      * @test
      */
diff --git a/typo3/sysext/workspaces/Classes/Domain/Record/AbstractRecord.php b/typo3/sysext/workspaces/Classes/Domain/Record/AbstractRecord.php
index 0659d37f1ef5..afef57974d91 100644
--- a/typo3/sysext/workspaces/Classes/Domain/Record/AbstractRecord.php
+++ b/typo3/sysext/workspaces/Classes/Domain/Record/AbstractRecord.php
@@ -13,6 +13,9 @@ namespace TYPO3\CMS\Workspaces\Domain\Record;
  *
  * The TYPO3 project - inspiring people to share!
  */
+
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Workspaces\Service\StagesService;
 
@@ -28,7 +31,13 @@ abstract class AbstractRecord
 
     protected static function fetch($tableName, $uid)
     {
-        $record = static::getDatabaseConnection()->exec_SELECTgetSingleRow('*', $tableName, 'deleted=0 AND uid=' . (int)$uid);
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
+        $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+        $record = $queryBuilder->select('*')
+            ->from($tableName)
+            ->where($queryBuilder->expr()->eq('uid', (int)$uid))
+            ->execute()
+            ->fetch();
         if (empty($record)) {
             throw new \RuntimeException('Record "' . $tableName . ': ' . $uid . '" not found');
         }
-- 
GitLab