diff --git a/typo3/sysext/backend/Classes/History/RecordHistory.php b/typo3/sysext/backend/Classes/History/RecordHistory.php index cf17cc7b551ec26e1eab467790c3b5e40488ac7e..74285ed914a448d4c0979127e6d51ad8785a41d6 100644 --- a/typo3/sysext/backend/Classes/History/RecordHistory.php +++ b/typo3/sysext/backend/Classes/History/RecordHistory.php @@ -15,6 +15,8 @@ namespace TYPO3\CMS\Backend\History; */ use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Query\QueryBuilder; use TYPO3\CMS\Core\DataHandling\DataHandler; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; @@ -136,13 +138,16 @@ class RecordHistory $this->showInsertDelete = 0; $this->showSubElements = 0; $element = explode(':', $this->element); - $record = $this->getDatabaseConnection()->exec_SELECTgetSingleRow( - '*', - 'sys_history', - 'tablename=' . $this->getDatabaseConnection()->fullQuoteStr($element[0], 'sys_history') . ' AND recuid=' . (int)$element[1], - '', - 'uid DESC' - ); + /** @var QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_history'); + $record = $queryBuilder + ->select('*') + ->from('sys_history') + ->where($queryBuilder->expr()->eq('tablename', $queryBuilder->createNamedParameter($element[0]))) + ->andWhere($queryBuilder->expr()->eq('recuid', (int)$element[1])) + ->orderBy('uid', 'DESC') + ->execute() + ->fetch(); $this->lastSyslogId = $record['sys_log_uid']; $this->createChangeLog(); $completeDiff = $this->createMultipleDiff(); @@ -188,9 +193,22 @@ class RecordHistory public function toggleHighlight($uid) { $uid = (int)$uid; - $row = $this->getDatabaseConnection()->exec_SELECTgetSingleRow('snapshot', 'sys_history', 'uid=' . $uid); + /** @var QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_history'); + $row = $queryBuilder + ->select('snapshot') + ->from('sys_history') + ->where($queryBuilder->expr()->eq('uid', $uid)) + ->execute() + ->fetch(); + if (!empty($row)) { - $this->getDatabaseConnection()->exec_UPDATEquery('sys_history', 'uid=' . $uid, array('snapshot' => !$row['snapshot'])); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_history'); + $queryBuilder + ->update('sys_history') + ->set('snapshot', (int)!$row['snapshot']) + ->where($queryBuilder->expr()->eq('uid', $uid)) + ->execute(); } } @@ -330,7 +348,7 @@ class RecordHistory 100 => array( 'value' => 100 ), - '' => array( + 999 => array( 'value' => 'maxSteps_all' ), 'marked' => array( @@ -376,7 +394,7 @@ class RecordHistory // set values correctly if ($currentSelection['maxSteps'] !== 'marked') { - $this->maxSteps = $currentSelection['maxSteps'] ? (int)$currentSelection['maxSteps'] : ''; + $this->maxSteps = $currentSelection['maxSteps'] ? (int)$currentSelection['maxSteps'] : $this->maxSteps; } else { $this->showMarked = true; $this->maxSteps = false; @@ -665,7 +683,18 @@ class RecordHistory if ($elParts[0] == 'pages' && $this->showSubElements && $this->hasPageAccess('pages', $elParts[1])) { foreach ($GLOBALS['TCA'] as $tablename => $value) { // check if there are records on the page - $rows = $this->getDatabaseConnection()->exec_SELECTgetRows('uid', $tablename, 'pid=' . (int)$elParts[1]); + /** @var QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tablename); + $queryBuilder + ->getQueryContext() + ->setIgnoreEnableFields(true) + ->setIncludeDeleted(true); + $rows = $queryBuilder + ->select('uid') + ->from($tablename) + ->where($queryBuilder->expr()->eq('pid', (int)$elParts[1])) + ->execute() + ->fetchAll(); if (empty($rows)) { continue; } @@ -702,12 +731,27 @@ class RecordHistory return 0; } // If table is found in $GLOBALS['TCA']: - $databaseConnection = $this->getDatabaseConnection(); $uid = $this->resolveElement($table, $uid); // Selecting the $this->maxSteps most recent states: - $rows = $databaseConnection->exec_SELECTgetRows('sys_history.*, sys_log.userid, sys_log.log_data', 'sys_history, sys_log', 'sys_history.sys_log_uid = sys_log.uid - AND sys_history.tablename = ' . $databaseConnection->fullQuoteStr($table, 'sys_history') . ' - AND sys_history.recuid = ' . (int)$uid, '', 'sys_log.uid DESC', $this->maxSteps); + /** @var QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_history'); + $rows = $queryBuilder + ->select('sys_history.*', 'sys_log.userid', 'sys_log.log_data') + ->from('sys_history') + ->from('sys_log') + ->where( + $queryBuilder->expr()->eq( + 'sys_history.sys_log_uid', + $queryBuilder->quoteIdentifier('sys_log.uid') + ) + ) + ->andWhere($queryBuilder->expr()->eq('sys_history.tablename', $queryBuilder->createNamedParameter($table))) + ->andWhere($queryBuilder->expr()->eq('sys_history.recuid', (int)$uid)) + ->orderBy('sys_log.uid', 'DESC') + ->setMaxResults((int)$this->maxSteps) + ->execute() + ->fetchAll(); + $changeLog = array(); if (!empty($rows)) { // Traversing the result, building up changesArray / changeLog: @@ -739,10 +783,23 @@ class RecordHistory // SELECT INSERTS/DELETES if ($this->showInsertDelete) { // Select most recent inserts and deletes // WITHOUT snapshots - $rows = $databaseConnection->exec_SELECTgetRows('uid, userid, action, tstamp, log_data', 'sys_log', 'type = 1 - AND (action=1 OR action=3) - AND tablename = ' . $databaseConnection->fullQuoteStr($table, 'sys_log') . ' - AND recuid = ' . (int)$uid, '', 'uid DESC', $this->maxSteps); + /** @var QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_log'); + $rows = $queryBuilder + ->select('uid', 'userid', 'action', 'tstamp', 'log_data') + ->from('sys_log') + ->where($queryBuilder->expr()->eq('type', 1)) + ->andWhere($queryBuilder->expr()->orX( + $queryBuilder->expr()->eq('action', 1), + $queryBuilder->expr()->eq('action', 3) + )) + ->andWhere($queryBuilder->expr()->eq('tablename', $queryBuilder->createNamedParameter($table))) + ->andWhere($queryBuilder->expr()->eq('recuid', (int)$uid)) + ->orderBy('uid', 'DESC') + ->setMaxResults((int)$this->maxSteps) + ->execute() + ->fetchAll(); + // If none are found, nothing more to do if (empty($rows)) { return $changeLog; @@ -881,7 +938,17 @@ class RecordHistory if (empty($shUid)) { return; } - $record = $this->getDatabaseConnection()->exec_SELECTgetSingleRow('*', 'sys_history', 'uid=' . (int)$shUid); + /** @var QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_history'); + $record = $queryBuilder + ->select('*') + ->from('sys_history') + ->where( + $queryBuilder->expr()->eq('uid', (int)$shUid) + ) + ->execute() + ->fetch(); + if (empty($record)) { return; } @@ -1004,14 +1071,6 @@ class RecordHistory return $GLOBALS['LANG']; } - /** - * @return \TYPO3\CMS\Core\Database\DatabaseConnection - */ - protected function getDatabaseConnection() - { - return $GLOBALS['TYPO3_DB']; - } - /** * returns a new standalone view, shorthand function *