Skip to content

Commit c49918f

Browse files
committed
Quote reserved platform keywords
1 parent fda985b commit c49918f

File tree

2 files changed

+102
-19
lines changed

2 files changed

+102
-19
lines changed

src/Attribute/TranslatedFile.php

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@
3535
use Contao\System;
3636
use Contao\Validator;
3737
use Doctrine\DBAL\Connection;
38+
use Doctrine\DBAL\DBALException;
39+
use Doctrine\DBAL\Platforms\Keywords\KeywordList;
3840
use Doctrine\DBAL\Query\QueryBuilder;
3941
use MetaModels\Attribute\TranslatedReference;
42+
use MetaModels\AttributeFileBundle\Doctrine\DBAL\Platforms\Keywords\NotSupportedKeywordList;
4043
use MetaModels\Helper\ToolboxFile;
4144
use MetaModels\IMetaModel;
4245
use MetaModels\Render\Template;
@@ -81,6 +84,13 @@ class TranslatedFile extends TranslatedReference
8184
*/
8285
private $config;
8386

87+
/**
88+
* The platform reserved keyword list.
89+
*
90+
* @var KeywordList
91+
*/
92+
private $platformReservedWord;
93+
8494
/**
8595
* {@inheritDoc}
8696
*
@@ -226,29 +236,29 @@ protected function getWhere($mixIds, $mixLangCode = '')
226236
private function addWhere(QueryBuilder $builder, $mixIds, $mixLangCode = ''): void
227237
{
228238
$builder
229-
->andWhere($builder->expr()->eq('att_id', ':attributeID'))
239+
->andWhere($builder->expr()->eq($this->quoteReservedWord('att_id'), ':attributeID'))
230240
->setParameter(':attributeID', $this->get('id'));
231241

232242
if (!empty($mixIds)) {
233243
if (\is_array($mixIds)) {
234244
$builder
235-
->andWhere($builder->expr()->in('item_id', ':itemIDs'))
245+
->andWhere($builder->expr()->in($this->quoteReservedWord('item_id'), ':itemIDs'))
236246
->setParameter('itemIDs', \array_map('intval', $mixIds), Connection::PARAM_INT_ARRAY);
237247
} else {
238248
$builder
239-
->andWhere($builder->expr()->eq('item_id', ':itemID'))
249+
->andWhere($builder->expr()->eq($this->quoteReservedWord('item_id'), ':itemID'))
240250
->setParameter('itemID', $mixIds);
241251
}
242252
}
243253

244254
if (!empty($mixLangCode)) {
245255
if (\is_array($mixLangCode)) {
246256
$builder
247-
->andWhere($builder->expr()->in('langcode', ':langcodes'))
257+
->andWhere($builder->expr()->in($this->quoteReservedWord('langcode'), ':langcodes'))
248258
->setParameter('langcodes', \array_map('strval', $mixLangCode), Connection::PARAM_STR_ARRAY);
249259
} else {
250260
$builder
251-
->andWhere($builder->expr()->eq('langcode', ':langcode'))
261+
->andWhere($builder->expr()->eq($this->quoteReservedWord('langcode'), ':langcode'))
252262
->setParameter('langcode', $mixLangCode);
253263
}
254264
}
@@ -422,9 +432,9 @@ public function valueToWidget($varValue)
422432
public function widgetToValue($varValue, $itemId)
423433
{
424434
return [
425-
'tstamp' => \time(),
426-
'value' => ToolboxFile::convertUuidsOrPathsToMetaModels((array) $varValue),
427-
'att_id' => $this->get('id')
435+
$this->quoteReservedWord('tstamp') => \time(),
436+
$this->quoteReservedWord('value') => ToolboxFile::convertUuidsOrPathsToMetaModels((array) $varValue),
437+
$this->quoteReservedWord('att_id') => $this->get('id')
428438
];
429439
}
430440

@@ -474,9 +484,14 @@ public function setTranslatedDataFor($arrValues, $strLangCode)
474484
$builder = $this->connection->createQueryBuilder();
475485

476486
if ($arrValues[$existingId]['value']['bin'][0]) {
477-
$builder->update($this->getValueTable());
487+
$setValues = $this->getSetValues($arrValues[$existingId], $existingId, $strLangCode);
488+
$builder->update($this->quoteReservedWord($this->getValueTable()));
489+
foreach ($setValues as $setValueKey => $setValue) {
490+
$builder->set($this->quoteReservedWord($setValueKey), ':' . $setValueKey);
491+
$builder->setParameter(':' . $setValueKey, $setValue);
492+
}
478493
} else {
479-
$builder->delete($this->getValueTable());
494+
$builder->delete($this->quoteReservedWord($this->getValueTable()));
480495
}
481496

482497
$this->addWhere($builder, $existingId, $strLangCode);
@@ -489,10 +504,12 @@ public function setTranslatedDataFor($arrValues, $strLangCode)
489504
continue;
490505
}
491506

492-
$this->connection->insert(
493-
$this->getValueTable(),
494-
$this->getSetValues($arrValues[$newId], $newId, $strLangCode)
495-
);
507+
$setValues = [];
508+
foreach ($this->getSetValues($arrValues[$newId], $newId, $strLangCode) as $setValueKey => $setValue) {
509+
$setValues[$this->quoteReservedWord($setValueKey)] = $setValue;
510+
}
511+
512+
$this->connection->insert($this->quoteReservedWord($this->getValueTable()), $setValues);
496513
}
497514
}
498515

@@ -521,4 +538,29 @@ public function getTranslatedDataFor($arrIds, $strLangCode)
521538

522539
return $values;
523540
}
541+
542+
/**
543+
* Quote the reserved platform key word.
544+
*
545+
* @param string $word The key word.
546+
*
547+
* @return string
548+
*/
549+
private function quoteReservedWord(string $word): string
550+
{
551+
if (null === $this->platformReservedWord) {
552+
try {
553+
$this->platformReservedWord = $this->connection->getDatabasePlatform()->getReservedKeywordsList();
554+
} catch (DBALException $exception) {
555+
// Add the not support key word list, if the platform has not a list of keywords.
556+
$this->platformReservedWord = new NotSupportedKeywordList();
557+
}
558+
}
559+
560+
if (false === $this->platformReservedWord->isKeyword($word)) {
561+
return $word;
562+
}
563+
564+
return $this->connection->quoteIdentifier($word);
565+
}
524566
}

src/Attribute/TranslatedFileOrder.php

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,26 @@
2525

2626
use Contao\StringUtil;
2727
use Doctrine\DBAL\Connection;
28+
use Doctrine\DBAL\DBALException;
29+
use Doctrine\DBAL\Platforms\Keywords\KeywordList;
2830
use Doctrine\DBAL\Query\QueryBuilder;
2931
use MetaModels\Attribute\IInternal;
3032
use MetaModels\Attribute\TranslatedReference;
33+
use MetaModels\AttributeFileBundle\Doctrine\DBAL\Platforms\Keywords\NotSupportedKeywordList;
3134
use MetaModels\Helper\ToolboxFile;
3235

3336
/**
3437
* This is the MetaModelAttribute class for handling translated file fields.
3538
*/
3639
class TranslatedFileOrder extends TranslatedReference implements IInternal
3740
{
41+
/**
42+
* The platform reserved keyword list.
43+
*
44+
* @var KeywordList
45+
*/
46+
private $platformReservedWord;
47+
3848
/**
3949
* {@inheritdoc}
4050
*/
@@ -72,18 +82,19 @@ public function valueToWidget($varValue)
7282

7383
return $this->get('file_multiple')
7484
? $varValue['value_sorting']['bin']
75-
: ($varValue['value_sorting']['bin'][0] ?? null);
85+
: ($varValue['value_sorting']['bin'][0] ?? null);
7686
}
7787

7888
/**
7989
* {@inheritdoc}
8090
*/
8191
public function widgetToValue($varValue, $itemId)
8292
{
93+
$sortingValue = ToolboxFile::convertUuidsOrPathsToMetaModels((array) $varValue);
8394
return [
84-
'tstamp' => \time(),
85-
'value_sorting' => ToolboxFile::convertUuidsOrPathsToMetaModels((array) $varValue),
86-
'att_id' => \substr($this->get('id'), 0, -\strlen('__sort'))
95+
$this->quoteReservedWord('tstamp') => \time(),
96+
$this->quoteReservedWord('value_sorting') => $sortingValue,
97+
$this->quoteReservedWord('att_id') => \substr($this->get('id'), 0, -\strlen('__sort'))
8798
];
8899
}
89100

@@ -154,7 +165,12 @@ public function setTranslatedDataFor($values, $langCode)
154165
}
155166

156167
$builder = $this->connection->createQueryBuilder();
157-
$builder->update($setValues);
168+
$builder->update($this->quoteReservedWord($this->getValueTable()));
169+
foreach ($setValues as $setValueKey => $setValue) {
170+
$builder->set($this->quoteReservedWord($setValueKey), ':' . $setValueKey);
171+
$builder->setParameter(':' . $setValueKey, $setValue);
172+
}
173+
158174
$this->addWhere($builder, $existingId, $langCode);
159175
$builder->execute();
160176
}
@@ -214,4 +230,29 @@ private function addWhere(QueryBuilder $builder, $mixIds, $mixLangCode = ''): vo
214230
}
215231
}
216232
}
233+
234+
/**
235+
* Quote the reserved platform key word.
236+
*
237+
* @param string $word The key word.
238+
*
239+
* @return string
240+
*/
241+
private function quoteReservedWord(string $word): string
242+
{
243+
if (null === $this->platformReservedWord) {
244+
try {
245+
$this->platformReservedWord = $this->connection->getDatabasePlatform()->getReservedKeywordsList();
246+
} catch (DBALException $exception) {
247+
// Add the not support key word list, if the platform has not a list of keywords.
248+
$this->platformReservedWord = new NotSupportedKeywordList();
249+
}
250+
}
251+
252+
if (false === $this->platformReservedWord->isKeyword($word)) {
253+
return $word;
254+
}
255+
256+
return $this->connection->quoteIdentifier($word);
257+
}
217258
}

0 commit comments

Comments
 (0)