TYPO3  7.6
extensionmanager/Classes/Domain/Repository/ExtensionRepository.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Extensionmanager\Domain\Repository;
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
21 {
25  const TABLE_NAME = 'tx_extensionmanager_domain_model_extension';
26 
31 
35  protected $dataMapper;
36 
40  public function injectDataMapper(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper $dataMapper)
41  {
42  $this->dataMapper = $dataMapper;
43  }
44 
50  public function initializeObject()
51  {
53  $defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface::class);
54  $defaultQuerySettings->setRespectStoragePage(false);
56  $this->databaseConnection = $GLOBALS['TYPO3_DB'];
57  }
58 
64  public function countAll()
65  {
66  $query = $this->createQuery();
67  $query = $this->addDefaultConstraints($query);
68  return $query->execute()->count();
69  }
70 
76  public function findAll()
77  {
78  $query = $this->createQuery();
79  $query = $this->addDefaultConstraints($query);
80  $query->setOrderings(
81  array(
82  'lastUpdated' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
83  )
84  );
85  return $query->execute();
86  }
87 
94  public function findByExtensionKeyOrderedByVersion($extensionKey)
95  {
96  $query = $this->createQuery();
97  $query->matching($query->logicalAnd($query->equals('extensionKey', $extensionKey), $query->greaterThanOrEqual('reviewState', 0)));
98  $query->setOrderings(array('version' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING));
99  return $query->execute();
100  }
101 
108  public function findOneByCurrentVersionByExtensionKey($extensionKey)
109  {
110  $query = $this->createQuery();
111  $query->matching(
112  $query->logicalAnd(
113  $query->equals('extensionKey', $extensionKey),
114  $query->greaterThanOrEqual('reviewState', 0),
115  $query->equals('currentVersion', 1)
116  )
117  );
118  $query->setLimit(1);
119  return $query->execute()->getFirst();
120  }
121 
129  public function findOneByExtensionKeyAndVersion($extensionKey, $version)
130  {
131  $query = $this->createQuery();
132  // Hint: This method must not filter out insecure extensions, if needed,
133  // it should be done on a different level, or with a helper method.
134  $query->matching($query->logicalAnd(
135  $query->equals('extensionKey', $extensionKey),
136  $query->equals('version', $version)
137  ));
138  return $query->setLimit(1)->execute()->getFirst();
139  }
140 
150  public function findByTitleOrAuthorNameOrExtensionKey($searchString)
151  {
152  $quotedSearchString = $this->databaseConnection->escapeStrForLike($this->databaseConnection->quoteStr($searchString, 'tx_extensionmanager_domain_model_extension'), 'tx_extensionmanager_domain_model_extension');
153  $quotedSearchStringForLike = '\'%' . $quotedSearchString . '%\'';
154  $quotedSearchString = '\'' . $quotedSearchString . '\'';
155  $select =
156  self::TABLE_NAME . '.*, ' .
157  'CASE ' .
158  'WHEN extension_key = ' . $quotedSearchString . ' THEN 16 ' .
159  'WHEN extension_key LIKE ' . $quotedSearchStringForLike . ' THEN 8 ' .
160  'WHEN title LIKE ' . $quotedSearchStringForLike . ' THEN 4 ' .
161  'WHEN description LIKE ' . $quotedSearchStringForLike . ' THEN 2 ' .
162  'WHEN author_name LIKE ' . $quotedSearchStringForLike . ' THEN 1 ' .
163  'END AS position';
164  $where = '(
165  extension_key = ' . $quotedSearchString . ' OR
166  extension_key LIKE ' . $quotedSearchStringForLike . ' OR
167  title LIKE ' . $quotedSearchStringForLike . ' OR
168  description LIKE ' . $quotedSearchStringForLike . ' OR
169  author_name LIKE ' . $quotedSearchStringForLike . '
170  )
171  AND current_version = 1 AND review_state >= 0';
172  $order = 'position DESC';
173  $result = $this->databaseConnection->exec_SELECTgetRows($select, self::TABLE_NAME, $where, '', $order);
174  return $this->dataMapper->map(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, $result);
175  }
176 
186  public function findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion = 0, $highestVersion = 0, $includeCurrentVersion = true)
187  {
188  $query = $this->createQuery();
189  $constraint = null;
190  if ($lowestVersion !== 0 && $highestVersion !== 0) {
191  if ($includeCurrentVersion) {
192  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->greaterThanOrEqual('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
193  } else {
194  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->greaterThan('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
195  }
196  } elseif ($lowestVersion === 0 && $highestVersion !== 0) {
197  if ($includeCurrentVersion) {
198  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->equals('extensionKey', $extensionKey));
199  } else {
200  $constraint = $query->logicalAnd($query->lessThan('integerVersion', $highestVersion), $query->equals('extensionKey', $extensionKey));
201  }
202  } elseif ($lowestVersion !== 0 && $highestVersion === 0) {
203  if ($includeCurrentVersion) {
204  $constraint = $query->logicalAnd($query->greaterThanOrEqual('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
205  } else {
206  $constraint = $query->logicalAnd($query->greaterThan('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
207  }
208  } elseif ($lowestVersion === 0 && $highestVersion === 0) {
209  $constraint = $query->equals('extensionKey', $extensionKey);
210  }
211  if ($constraint) {
212  $query->matching($query->logicalAnd($constraint, $query->greaterThanOrEqual('reviewState', 0)));
213  }
214  $query->setOrderings(array(
215  'integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
216  ));
217  return $query->execute();
218  }
219 
226  {
227  $query = $this->createQuery();
228  $query->matching(
229  $query->logicalAnd(
230  $query->equals('category', \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::DISTRIBUTION_CATEGORY),
231  $query->equals('currentVersion', 1),
232  $query->logicalNot($query->equals('ownerusername', 'typo3v4'))
233  )
234  );
235 
236  $query->setOrderings(array(
237  'alldownloadcounter' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
238  ));
239 
240  return $query->execute();
241  }
242 
249  {
250  $query = $this->createQuery();
251  $query->matching(
252  $query->logicalAnd(
253  $query->equals('category', \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::DISTRIBUTION_CATEGORY),
254  $query->equals('currentVersion', 1),
255  $query->equals('ownerusername', 'typo3v4')
256  )
257  );
258 
259  $query->setOrderings(array(
260  'alldownloadcounter' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
261  ));
262 
263  return $query->execute();
264  }
265 
274  public function countByVersionRangeAndExtensionKey($extensionKey, $lowestVersion = 0, $highestVersion = 0)
275  {
276  return $this->findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion, $highestVersion)->count();
277  }
278 
285  public function findHighestAvailableVersion($extensionKey)
286  {
287  $query = $this->createQuery();
288  $query->matching($query->logicalAnd($query->equals('extensionKey', $extensionKey), $query->greaterThanOrEqual('reviewState', 0)));
289  $query->setOrderings(array(
290  'integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
291  ));
292  return $query->setLimit(1)->execute()->getFirst();
293  }
294 
301  public function insertLastVersion($repositoryUid = 1)
302  {
303  $this->markExtensionWithMaximumVersionAsCurrent($repositoryUid);
304 
305  return $this->getNumberOfCurrentExtensions();
306  }
307 
316  protected function markExtensionWithMaximumVersionAsCurrent($repositoryUid)
317  {
318  $uidsOfCurrentVersion = $this->fetchMaximalVersionsForAllExtensions($repositoryUid);
319 
320  $this->databaseConnection->exec_UPDATEquery(
321  self::TABLE_NAME,
322  'uid IN (' . implode(',', $uidsOfCurrentVersion) . ')',
323  array(
324  'current_version' => 1,
325  )
326  );
327  }
328 
337  protected function fetchMaximalVersionsForAllExtensions($repositoryUid)
338  {
339  $queryResult = $this->databaseConnection->sql_query(
340  'SELECT a.uid AS uid ' .
341  'FROM ' . self::TABLE_NAME . ' a ' .
342  'LEFT JOIN ' . self::TABLE_NAME . ' b ON a.repository = b.repository AND a.extension_key = b.extension_key AND a.integer_version < b.integer_version ' .
343  'WHERE a.repository = ' . (int)$repositoryUid . ' AND b.extension_key IS NULL ' .
344  'ORDER BY a.uid'
345  );
346 
347  $extensionUids = array();
348  while ($row = $this->databaseConnection->sql_fetch_assoc($queryResult)) {
349  $extensionUids[] = $row['uid'];
350  }
351  $this->databaseConnection->sql_free_result($queryResult);
352  return $extensionUids;
353  }
354 
360  protected function getNumberOfCurrentExtensions()
361  {
362  return $this->databaseConnection->exec_SELECTcountRows(
363  '*',
364  self::TABLE_NAME,
365  'current_version = 1'
366  );
367  }
368 
376  protected function addDefaultConstraints(\TYPO3\CMS\Extbase\Persistence\Generic\Query $query)
377  {
378  if ($query->getConstraint()) {
379  $query->matching($query->logicalAnd(
380  $query->getConstraint(),
381  $query->equals('current_version', true),
382  $query->greaterThanOrEqual('reviewState', 0)
383  ));
384  } else {
385  $query->matching($query->logicalAnd(
386  $query->equals('current_version', true),
387  $query->greaterThanOrEqual('reviewState', 0)
388  ));
389  }
390  return $query;
391  }
392 }