3535use Contao \System ;
3636use Contao \Validator ;
3737use Doctrine \DBAL \Connection ;
38+ use Doctrine \DBAL \DBALException ;
39+ use Doctrine \DBAL \Platforms \Keywords \KeywordList ;
3840use Doctrine \DBAL \Query \QueryBuilder ;
3941use MetaModels \Attribute \TranslatedReference ;
42+ use MetaModels \AttributeFileBundle \Doctrine \DBAL \Platforms \Keywords \NotSupportedKeywordList ;
4043use MetaModels \Helper \ToolboxFile ;
4144use MetaModels \IMetaModel ;
4245use 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}
0 commit comments