Index: class.ux_t3lib_db.php =================================================================== --- class.ux_t3lib_db.php (revision 26402) +++ class.ux_t3lib_db.php (working copy) @@ -726,8 +726,59 @@ return $sqlResult; } + /** + * Executes a query. + * EXPERIMENTAL since TYPO3 4.3. + * + * @param array $queryParts SQL parsed by method parseSQL() of t3lib_sqlparser + * @return pointer Result pointer / DBAL object + * @see ux_t3lib_db::sql_query() + */ + protected function exec_query(array $queryParts) { + switch ($queryParts['type']) { + case 'SELECT': + $selectFields = $this->SQLparser->compileFieldList($queryParts['SELECT']); + $fromTables = $this->SQLparser->compileFromTables($queryParts['FROM']); + $whereClause = isset($queryParts['WHERE']) ? $this->SQLparser->compileWhereClause($queryParts['WHERE']) : '1=1'; + $groupBy = isset($queryParts['GROUPBY']) ? $this->SQLparser->compileWhereClause($queryParts['GROUPBY']) : ''; + $orderBy = isset($queryParts['GROUPBY']) ? $this->SQLparser->compileWhereClause($queryParts['ORDERBY']) : ''; + $limit = isset($queryParts['LIMIT']) ? $this->SQLparser->compileWhereClause($queryParts['LIMIT']) : ''; + return $this->exec_SELECTquery($selectFields, $fromTables, $whereClause, $groupBy, $orderBy, $limit); + case 'UPDATE': + $table = $queryParts['TABLE']; + $fields = array(); + foreach ($components['FIELDS'] as $fN => $fV) { + $fields[$fN] = $fV[0]; + } + $whereClause = isset($queryParts['WHERE']) ? $this->SQLparser->compileWhereClause($queryParts['WHERE']) : '1=1'; + return $this->exec_UPDATEquery($table, $whereClause, $fields); + case 'INSERT': + $table = $queryParts['TABLE']; + $values = array(); + if (isset($queryParts['VALUES_ONLY']) && is_array($queryParts['VALUES_ONLY'])) { + $fields = $GLOBALS['TYPO3_DB']->cache_fieldType[$table]; + $fc = 0; + foreach ($fields as $fn => $fd) { + $values[$fn] = $queryParts['VALUES_ONLY'][$fc++][0]; + } + } else { + foreach ($queryParts['FIELDS'] as $fN => $fV) { + $values[$fN] = $fV[0]; + } + } + return $this->exec_INSERTquery($table, $values); + + case 'DELETE': + $table = $queryParts['TABLE']; + $whereClause = isset($queryParts['WHERE']) ? $this->SQLparser->compileWhereClause($queryParts['WHERE']) : '1=1'; + return $this->exec_DELETEquery($table, $whereClause); + } + } + + + /************************************** * * Query building @@ -1651,16 +1702,27 @@ } /** - * Executes query (on DEFAULT handler!) - * DEPRECATED - use exec_* functions from this class instead! + * Executes a query + * EXPERIMENTAL - This method will make its best to handle the query correctly + * but if it cannot, it will simply pass the query to DEFAULT handler. * - * If you don't, anything that uses not the _DEFAULT handler will break! + * You should use exec_* function from this class instead! + * If you don't, anything that does not use the _DEFAULT handler will probably break! + * + * This method was deprecated in TYPO3 4.1 but is considered experimental since TYPO3 4.3 + * as it tries to handle the query correctly anyway. * * @param string Query to execute * @return pointer Result pointer / DBAL object - * @deprecated since TYPO3 4.1 */ public function sql_query($query) { + // This method is heavily used by Extbase, try to handle it with DBAL-native methods + $queryParts = $this->SQLparser->parseSQL($query); + $supportedTypes = array('SELECT', 'UPDATE', 'INSERT', 'DELETE'); + if (is_array($queryParts) && in_array($queryParts['type'], $supportedTypes)) { + return $this->exec_query($queryParts); + } + switch ($this->handlerCfg['_DEFAULT']['type']) { case 'native': $sqlResult = mysql_query($query, $this->handlerInstance['_DEFAULT']['link']);