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