[~CONFIGURATION] Extbase: Set lockType to empty string instead of 'system'.
[Packages/TYPO3.CMS.git] / typo3 / sysext / extbase / Classes / Persistence / Storage / Typo3DbBackend.php
index f971e96..6c941f2 100644 (file)
@@ -207,7 +207,7 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
 
                        $statement = 'SELECT ' . implode(',', $sql['fields']) . ' FROM ' . implode(' ', $sql['tables']);
 
-                       $this->parseConstraint($query->getConstraint(), $source, $sql, $parameters, $query->getBoundVariableValues());
+                       $this->parseConstraint($constraint, $source, $sql, $parameters, $query->getBoundVariableValues());
 
                        if (!empty($sql['where'])) {
                                $statement .= ' WHERE ' . implode('', $sql['where']);
@@ -218,7 +218,7 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
                                $statement .= ' WHERE ' . implode(' AND ', $sql['additionalWhereClause']);
                        }
 
-                       $this->parseOrderings($query->getOrderings(), $source, $sql, $parameters, $query->getBoundVariableValues());
+                       $this->parseOrderings($query->getOrderings(), $source, $sql);
                        if (!empty($sql['orderings'])) {
                                $statement .= ' ORDER BY ' . implode(', ', $sql['orderings']);
                        }
@@ -230,7 +230,7 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
                }
 
                $this->replacePlaceholders($statement, $parameters);
-
+               // debug($statement,-2);
                return $statement;
        }
 
@@ -239,23 +239,31 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
         *
         * @param array $properties The properties of the Value Object
         * @param Tx_Extbase_Persistence_Mapper_DataMap $dataMap The Data Map
-        * @return array The matching tuples
+        * @return array The matching uid
         */
        public function hasValueObject(array $properties, Tx_Extbase_Persistence_Mapper_DataMap $dataMap) {
                $fields = array();
                $parameters = array();
                foreach ($properties as $propertyName => $propertyValue) {
-                       if ($dataMap->isPersistableProperty($propertyName) && ($propertyName !== 'uid')) {
+                       // FIXME We couple the Backend to the Entity implementation (uid, isClone); changes there breaks this method
+                       if ($dataMap->isPersistableProperty($propertyName) && ($propertyName !== 'uid')  && ($propertyName !== 'pid') && ($propertyName !== 'isClone')) {
                                $fields[] = $dataMap->getColumnMap($propertyName)->getColumnName() . '=?';
                                $parameters[] = $dataMap->convertPropertyValueToFieldValue($propertyValue);
                        }
                }
-               $fields[] = 'deleted!=1';
-               $fields[] = 'hidden!=1';
-
-               $sqlString = 'SELECT * FROM ' . $dataMap->getTableName() .  ' WHERE ' . implode(' AND ', $fields);
-               $this->replacePlaceholders($sqlString, $parameters);
-               $res = $this->databaseHandle->sql_query($sqlString);
+               $sql = array();
+               $sql['additionalWhereClause'] = array();
+               
+               $tableName = $dataMap->getTableName();
+               $this->addEnableFieldsStatement($tableName, $sql);
+               
+               $statement = 'SELECT * FROM ' . $tableName;
+               $statement .= ' WHERE ' . implode(' AND ', $fields);
+               if (!empty($sql['additionalWhereClause'])) {
+                       $statement .= ' AND ' . implode(' AND ', $sql['additionalWhereClause']);
+               }
+               $this->replacePlaceholders($statement, $parameters);
+               $res = $this->databaseHandle->sql_query($statement);
                $this->checkSqlErrors();
                $row = $this->databaseHandle->sql_fetch_assoc($res);
                if ($row !== FALSE) {
@@ -289,20 +297,19 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
                                }
                        }
                } elseif ($source instanceof Tx_Extbase_Persistence_QOM_JoinInterface) {
-                       $this->parseJoin($query, $source, $sql, $parameters);
+                       $this->parseJoin($query, $source, $sql);
                }
        }
 
        /**
         * Transforms a Join into SQL and parameter arrays
         *
-        * @param Tx_Extbase_Persistence_QOM_QueryObjectModel $query
-        * @param Tx_Extbase_Persistence_QOM_JoinInterface $join
-        * @param array &$sql
-        * @param array &$parameters
+        * @param Tx_Extbase_Persistence_QOM_QueryObjectModel $query The Query Object Model
+        * @param Tx_Extbase_Persistence_QOM_JoinInterface $join The join
+        * @param array &$sql The query parts
         * @return void
         */
-       protected function parseJoin(Tx_Extbase_Persistence_QOM_QueryObjectModelInterface $query, Tx_Extbase_Persistence_QOM_JoinInterface $join, array &$sql, array &$parameters) {
+       protected function parseJoin(Tx_Extbase_Persistence_QOM_QueryObjectModelInterface $query, Tx_Extbase_Persistence_QOM_JoinInterface $join, array &$sql) {
                $leftSource = $join->getLeft();
                $leftTableName = $leftSource->getSelectorName();
                $rightSource = $join->getRight();
@@ -317,6 +324,7 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
                $joinCondition = $join->getJoinCondition();
                // TODO Check the parsing of the join
                if ($joinCondition instanceof Tx_Extbase_Persistence_QOM_EquiJoinCondition) {
+                       // TODO Discuss, if we should use $leftSource instead of $selector1Name
                        $column1Name = $this->dataMapper->convertPropertyNameToColumnName($joinCondition->getProperty1Name(), $leftSource->getNodeTypeName());
                        $column2Name = $this->dataMapper->convertPropertyNameToColumnName($joinCondition->getProperty2Name(), $rightSource->getNodeTypeName());
                        $sql['tables'][] = 'ON ' . $joinCondition->getSelector1Name() . '.' . $column1Name . ' = ' . $joinCondition->getSelector2Name() . '.' . $column2Name;
@@ -339,11 +347,11 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
        /**
         * Transforms a constraint into SQL and parameter arrays
         *
-        * @param Tx_Extbase_Persistence_QOM_ConstraintInterface $constraint
+        * @param Tx_Extbase_Persistence_QOM_ConstraintInterface $constraint The constraint
         * @param Tx_Extbase_Persistence_QOM_SourceInterface $source The source
-        * @param array &$sql
-        * @param array &$parameters
-        * @param array $boundVariableValues
+        * @param array &$sql The query parts
+        * @param array &$parameters The parameters that will replace the markers
+        * @param array $boundVariableValues The bound variables in the query (key) and their values (value)
         * @return void
         */
        protected function parseConstraint(Tx_Extbase_Persistence_QOM_ConstraintInterface $constraint = NULL, Tx_Extbase_Persistence_QOM_SourceInterface $source, array &$sql, array &$parameters, array $boundVariableValues) {
@@ -405,16 +413,16 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
         * @param Tx_Extbase_Persistence_QOM_DynamicOperandInterface $operand
         * @param string $operator One of the JCR_OPERATOR_* constants
         * @param Tx_Extbase_Persistence_QOM_SourceInterface $source The source
-        * @param array &$sql SQL query parts to add to
-        * @param array &$parameters
-        * @param string $valueFunction an aoptional SQL function to apply to the operand value
+        * @param array &$sql The query parts
+        * @param array &$parameters The parameters that will replace the markers
+        * @param string $valueFunction an optional SQL function to apply to the operand value
         * @return void
         */
        protected function parseDynamicOperand(Tx_Extbase_Persistence_QOM_DynamicOperandInterface $operand, $operator, Tx_Extbase_Persistence_QOM_SourceInterface $source, array &$sql, array &$parameters, $valueFunction = NULL) {
                if ($operand instanceof Tx_Extbase_Persistence_QOM_LowerCaseInterface) {
-                       $this->parseDynamicOperand($operand->getOperand(), $operator, $sql, $parameters, 'LOWER');
+                       $this->parseDynamicOperand($operand->getOperand(), $operator, $source, $sql, $parameters, 'LOWER');
                } elseif ($operand instanceof Tx_Extbase_Persistence_QOM_UpperCaseInterface) {
-                       $this->parseDynamicOperand($operand->getOperand(), $operator, $sql, $parameters, 'UPPER');
+                       $this->parseDynamicOperand($operand->getOperand(), $operator, $source, $sql, $parameters, 'UPPER');
                } elseif ($operand instanceof Tx_Extbase_Persistence_QOM_PropertyValueInterface) {
                        $tableName = $operand->getSelectorName();
                        // FIXME Discuss the translation from propertyName to columnName
@@ -482,7 +490,7 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
         * Replace query placeholders in a query part by the given
         * parameters.
         *
-        * @param string $queryPart The query part with placeholders
+        * @param string $sqlString The query part with placeholders
         * @param array $parameters The parameters
         * @return string The query part with replaced placeholders
         */
@@ -540,15 +548,14 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
        }
 
        /**
-        * Transforms orderings into SQL
+        * Transforms orderings into SQL.
         *
-        * @param array $orderings
-        * @param array &$sql
-        * @param array &$parameters
-        * @param array $boundVariableValues
+        * @param array $orderings Ann array of orderings (Tx_Extbase_Persistence_QOM_Ordering)
+        * @param Tx_Extbase_Persistence_QOM_SourceInterface $source The source
+        * @param array &$sql The query parts
         * @return void
         */
-       protected function parseOrderings(array $orderings, Tx_Extbase_Persistence_QOM_SourceInterface $source, array &$sql, array &$parameters, array $boundVariableValues) {
+       protected function parseOrderings(array $orderings, Tx_Extbase_Persistence_QOM_SourceInterface $source, array &$sql) {
                foreach ($orderings as $ordering) {
                        $operand = $ordering->getOperand();
                        $order = $ordering->getOrder();
@@ -561,15 +568,18 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
                                                $order = 'DESC';
                                                break;
                                        default:
-                                               throw new Tx_Extbase_Persistence_Exception('Unsupported order encountered.', 1242816074);
+                                               throw new Tx_Extbase_Persistence_Exception_UnsupportedOrder('Unsupported order encountered.', 1242816074);
                                }
-                               if ($source instanceof Tx_Extbase_Persistence_QOM_SelectorInterface) {
-                                       $nodeTypeName = $source->getNodeTypeName();
+                               $tableName = $operand->getSelectorName();
+                               if ((strlen($tableName) == 0) && (source instanceof Tx_Extbase_Persistence_QOM_SelectorInterface)) {
+                                       $tableName = $source->getSelectorName();
+                               }
+                               $columnName = $this->dataMapper->convertPropertyNameToColumnName($operand->getPropertyName(), $tableName);
+                               if (strlen($tableName) > 0) {
+                                       $sql['orderings'][] = $tableName . '.' . $columnName . ' ' . $order;
                                } else {
-                                       $nodeTypeName = '';
+                                       $sql['orderings'][] = $columnName . ' ' . $order;
                                }
-                               $columnName = $this->dataMapper->convertPropertyNameToColumnName($ordering->getOperand()->getPropertyName(), $nodeTypeName);
-                               $sql['orderings'][] = $columnName . ' ' . $order;
                        }
                }
        }
@@ -595,7 +605,7 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
         * workspace overlay before.
         *
         * @param Tx_Extbase_Persistence_QOM_SourceInterface $source The source (selector od join)
-        *
+        * @param resource &$sql The resource
         * @return array The result as an array of rows (tuples)
         */
        protected function getRowsFromResult(Tx_Extbase_Persistence_QOM_SourceInterface $source, $res) {