/typo3/sysext/dbal/class.ux_t3lib_db.php
PHP | 3373 lines | 2068 code | 383 blank | 922 comment | 472 complexity | 5d57942da2ed45977e109034af05d4eb MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0, Unlicense, LGPL-2.1, Apache-2.0
Large files files are truncated, but you can click here to view the full file
- <?php
- /***************************************************************
- * Copyright notice
- *
- * (c) 2004-2010 Kasper Skaarhoj (kasperYYYY@typo3.com)
- * (c) 2004-2010 Karsten Dambekalns <karsten@typo3.org>
- * (c) 2009-2010 Xavier Perseguers <typo3@perseguers.ch>
- * All rights reserved
- *
- * This script is part of the TYPO3 project. The TYPO3 project is
- * free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * The GNU General Public License can be found at
- * http://www.gnu.org/copyleft/gpl.html.
- * A copy is found in the textfile GPL.txt and important notices to the license
- * from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- * This script is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
- /**
- * Contains a database abstraction layer class for TYPO3
- *
- * $Id: class.ux_t3lib_db.php 29977 2010-02-13 13:18:32Z xperseguers $
- *
- * @author Kasper Skaarhoj <kasper@typo3.com>
- * @author Karsten Dambekalns <k.dambekalns@fishfarm.de>
- * @author Xavier Perseguers <typo3@perseguers.ch>
- */
- /**
- * [CLASS/FUNCTION INDEX of SCRIPT]
- *
- *
- *
- * 123: class ux_t3lib_DB extends t3lib_DB
- * 169: function ux_t3lib_DB()
- * 184: function initInternalVariables()
- *
- * SECTION: Query Building (Overriding parent methods)
- * 217: function exec_INSERTquery($table,$fields_values)
- * 275: function exec_UPDATEquery($table,$where,$fields_values)
- * 334: function exec_DELETEquery($table,$where)
- * 387: function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy = '',$orderBy = '',$limit = '')
- *
- * SECTION: Creates an INSERT SQL-statement for $table from the array with field/value pairs $fields_values.
- * 533: function SELECTquery($select_fields,$from_table,$where_clause,$groupBy = '',$orderBy = '',$limit = '')
- * 556: function quoteSelectFields(&$select_fields)
- * 573: function quoteFromTables(&$from_table)
- * 595: function quoteWhereClause(&$where_clause)
- * 620: function quoteGroupBy(&$groupBy)
- * 637: function quoteOrderBy(&$orderBy)
- *
- * SECTION: Various helper functions
- * 663: function quoteStr($str, $table)
- *
- * SECTION: SQL wrapper functions (Overriding parent methods)
- * 707: function sql_error()
- * 734: function sql_num_rows(&$res)
- * 760: function sql_fetch_assoc(&$res)
- * 808: function sql_fetch_row(&$res)
- * 842: function sql_free_result(&$res)
- * 868: function sql_insert_id()
- * 893: function sql_affected_rows()
- * 919: function sql_data_seek(&$res,$seek)
- * 946: function sql_field_type(&$res,$pointer)
- *
- * SECTION: Legacy functions, bound to _DEFAULT handler. (Overriding parent methods)
- * 987: function sql($db,$query)
- * 999: function sql_query($query)
- * 1035: function sql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password)
- * 1055: function sql_select_db($TYPO3_db)
- *
- * SECTION: SQL admin functions
- * 1086: function admin_get_tables()
- * 1149: function admin_get_fields($tableName)
- * 1210: function admin_get_keys($tableName)
- * 1270: function admin_query($query)
- *
- * SECTION: Handler management
- * 1333: function handler_getFromTableList($tableList)
- * 1379: function handler_init($handlerKey)
- *
- * SECTION: Table/Field mapping
- * 1488: function map_needMapping($tableList,$fieldMappingOnly = FALSE)
- * 1524: function map_assocArray($input,$tables,$rev = FALSE)
- * 1573: function map_remapSELECTQueryParts(&$select_fields,&$from_table,&$where_clause,&$groupBy,&$orderBy)
- * 1615: function map_sqlParts(&$sqlPartArray, $defaultTable)
- * 1650: function map_genericQueryParsed(&$parsedQuery)
- * 1717: function map_fieldNamesInArray($table,&$fieldArray)
- *
- * SECTION: Debugging
- * 1758: function debugHandler($function,$execTime,$inData)
- * 1823: function debug_log($query,$ms,$data,$join,$errorFlag)
- * 1849: function debug_explain($query)
- *
- * TOTAL FUNCTIONS: 41
- * (This index is automatically created/updated by the extension "extdeveval")
- *
- */
- /**
- * TYPO3 database abstraction layer
- *
- * @author Kasper Skaarhoj <kasper@typo3.com>
- * @author Karsten Dambekalns <k.dambekalns@fishfarm.de>
- * @package TYPO3
- * @subpackage tx_dbal
- */
- class ux_t3lib_DB extends t3lib_DB {
- // Internal, static:
- var $printErrors = FALSE; // Enable output of SQL errors after query executions. Set through TYPO3_CONF_VARS, see init()
- var $debug = FALSE; // Enable debug mode. Set through TYPO3_CONF_VARS, see init()
- var $conf = array(); // Configuration array, copied from TYPO3_CONF_VARS in constructor.
- var $mapping = array(); // See manual.
- var $table2handlerKeys = array(); // See manual.
- var $handlerCfg = array( // See manual.
- '_DEFAULT' => array(
- 'type' => 'native',
- 'config' => array(
- 'username' => '', // Set by default (overridden)
- 'password' => '', // Set by default (overridden)
- 'host' => '', // Set by default (overridden)
- 'database' => '', // Set by default (overridden)
- 'driver' => '', // ONLY "adodb" type; eg. "mysql"
- 'sequenceStart' => 1, // ONLY "adodb", first number in sequences/serials/...
- 'useNameQuote' => 0 // ONLY "adodb", whether to use NameQuote() method from ADOdb to quote names
- )
- ),
- );
- // Internal, dynamic:
- var $handlerInstance = array(); // Contains instance of the handler objects as they are created. Exception is the native mySQL calls which are registered as an array with keys "handlerType" = "native" and "link" pointing to the link resource for the connection.
- var $lastHandlerKey = ''; // Storage of the handler key of last ( SELECT) query - used for subsequent fetch-row calls etc.
- var $lastQuery = ''; // Storage of last SELECT query
- var $lastParsedAndMappedQueryArray = array(); // Query array, the last one parsed
- var $resourceIdToTableNameMap = array(); // Mapping of resource ids to table names.
- // Internal, caching:
- var $cache_handlerKeyFromTableList = array(); // Caching handlerKeys for table lists
- var $cache_mappingFromTableList = array(); // Caching mapping information for table lists
- var $cache_autoIncFields = array(); // parsed SQL from standard DB dump file
- var $cache_fieldType = array(); // field types for tables/fields
- var $cache_primaryKeys = array(); // primary keys
- /**
- * SQL parser
- *
- * @var tx_dbal_sqlengine
- */
- var $SQLparser;
- /**
- * Installer
- *
- * @var t3lib_install
- */
- var $Installer;
- /**
- * Constructor.
- * Creates SQL parser object and imports configuration from $TYPO3_CONF_VARS['EXTCONF']['dbal']
- */
- public function __construct() {
- // Set SQL parser object for internal use:
- $this->SQLparser = t3lib_div::makeInstance('tx_dbal_sqlengine');
- $this->Installer = t3lib_div::makeInstance('t3lib_install');
- // Set internal variables with configuration:
- $this->conf = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['dbal'];
- $this->initInternalVariables();
- }
- /**
- * Setting internal variables from $this->conf.
- *
- * @return void
- */
- protected function initInternalVariables() {
- // Set outside configuration:
- if (isset($this->conf['mapping'])) {
- $this->mapping = $this->conf['mapping'];
- }
- if (isset($this->conf['table2handlerKeys'])) {
- $this->table2handlerKeys = $this->conf['table2handlerKeys'];
- }
- if (isset($this->conf['handlerCfg'])) {
- $this->handlerCfg = $this->conf['handlerCfg'];
- }
- $this->cacheFieldInfo();
- // Debugging settings:
- $this->printErrors = $this->conf['debugOptions']['printErrors'] ? TRUE : FALSE;
- $this->debug = $this->conf['debugOptions']['enabled'] ? TRUE : FALSE;
- }
- /**
- * Clears the cached field information file.
- *
- * @return void
- */
- public function clearCachedFieldInfo() {
- if (file_exists(PATH_typo3conf . 'temp_fieldInfo.php')) {
- unlink(PATH_typo3conf . 'temp_fieldInfo.php');
- }
- }
- /**
- * Caches the field information.
- *
- * @return void
- */
- public function cacheFieldInfo() {
- $extSQL = '';
- $parsedExtSQL = array();
- // try to fetch cached file first
- // file is removed when admin_query() is called
- if (file_exists(PATH_typo3conf . 'temp_fieldInfo.php')) {
- $fdata = unserialize(t3lib_div::getUrl(PATH_typo3conf . 'temp_fieldInfo.php'));
- $this->cache_autoIncFields = $fdata['incFields'];
- $this->cache_fieldType = $fdata['fieldTypes'];
- $this->cache_primaryKeys = $fdata['primaryKeys'];
- } else {
- // handle stddb.sql, parse and analyze
- $extSQL = t3lib_div::getUrl(PATH_site . 't3lib/stddb/tables.sql');
- $parsedExtSQL = $this->Installer->getFieldDefinitions_fileContent($extSQL);
- $this->analyzeFields($parsedExtSQL);
- // loop over all installed extensions
- foreach ($GLOBALS['TYPO3_LOADED_EXT'] as $ext => $v) {
- if (!is_array($v) || !isset($v['ext_tables.sql'])) {
- continue;
- }
- // fetch db dump (if any) and parse it, then analyze
- $extSQL = t3lib_div::getUrl($v['ext_tables.sql']);
- $parsedExtSQL = $this->Installer->getFieldDefinitions_fileContent($extSQL);
- $this->analyzeFields($parsedExtSQL);
- }
- $cachedFieldInfo = array('incFields' => $this->cache_autoIncFields, 'fieldTypes' => $this->cache_fieldType, 'primaryKeys' => $this->cache_primaryKeys);
- $cachedFieldInfo = serialize($this->mapCachedFieldInfo($cachedFieldInfo));
- // write serialized content to file
- t3lib_div::writeFile(PATH_typo3conf . 'temp_fieldInfo.php', $cachedFieldInfo);
- if (strcmp(t3lib_div::getUrl(PATH_typo3conf . 'temp_fieldInfo.php'), $cachedFieldInfo)) {
- die('typo3temp/temp_incfields.php was NOT updated properly (written content didn\'t match file content) - maybe write access problem?');
- }
- }
- }
- /**
- * Analyzes fields and adds the extracted information to the field type, auto increment and primary key info caches.
- *
- * @param array $parsedExtSQL The output produced by t3lib_install::getFieldDefinitions_fileContent()
- * @return void
- * @see t3lib_install::getFieldDefinitions_fileContent()
- */
- protected function analyzeFields($parsedExtSQL) {
- foreach ($parsedExtSQL as $table => $tdef) {
- if (is_array($tdef['fields'])) {
- foreach ($tdef['fields'] as $field => $fdef) {
- $fdef = $this->SQLparser->parseFieldDef($fdef);
- $this->cache_fieldType[$table][$field]['type'] = $fdef['fieldType'];
- $this->cache_fieldType[$table][$field]['metaType'] = $this->MySQLMetaType($fdef['fieldType']);
- $this->cache_fieldType[$table][$field]['notnull'] = (isset($fdef['featureIndex']['NOTNULL']) && !$this->SQLparser->checkEmptyDefaultValue($fdef['featureIndex'])) ? 1 : 0;
- if (isset($fdef['featureIndex']['DEFAULT'])) {
- $default = $fdef['featureIndex']['DEFAULT']['value'][0];
- if (isset($fdef['featureIndex']['DEFAULT']['value'][1])) {
- $default = $fdef['featureIndex']['DEFAULT']['value'][1] . $default . $fdef['featureIndex']['DEFAULT']['value'][1];
- }
- $this->cache_fieldType[$table][$field]['default'] = $default;
- }
- if (isset($fdef['featureIndex']['AUTO_INCREMENT'])) {
- $this->cache_autoIncFields[$table] = $field;
- }
- if (isset($tdef['keys']['PRIMARY'])) {
- $this->cache_primaryKeys[$table] = substr($tdef['keys']['PRIMARY'], 13, -1);
- }
- }
- }
- }
- }
- /**
- * This function builds all definitions for mapped tables and fields
- * @see cacheFieldInfo()
- */
- protected function mapCachedFieldInfo($fieldInfo) {
- if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['dbal']['mapping'])) {
- foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['dbal']['mapping'] as $mappedTable => $mappedConf) {
- if (array_key_exists($mappedTable, $fieldInfo['incFields'])) {
- $mappedTableAlias = $mappedConf['mapTableName'];
- if (isset($mappedConf['mapFieldNames'][$fieldInfo['incFields'][$mappedTable]])) {
- $fieldInfo['incFields'][$mappedTableAlias] = $mappedConf['mapFieldNames'][$fieldInfo['incFields'][$mappedTable]];
- } else {
- $fieldInfo['incFields'][$mappedTableAlias] = $fieldInfo['incFields'][$mappedTable];
- }
- }
- if (array_key_exists($mappedTable, $fieldInfo['fieldTypes'])) {
- foreach ($fieldInfo['fieldTypes'][$mappedTable] as $field => $fieldConf) {
- $tempMappedFieldConf[$mappedConf['mapFieldNames'][$field]] = $fieldConf;
- }
- $fieldInfo['fieldTypes'][$mappedConf['mapTableName']] = $tempMappedFieldConf;
- }
- if (array_key_exists($mappedTable, $fieldInfo['primaryKeys'])) {
- $mappedTableAlias = $mappedConf['mapTableName'];
- if (isset($mappedConf['mapFieldNames'][$fieldInfo['primaryKeys'][$mappedTable]])) {
- $fieldInfo['primaryKeys'][$mappedTableAlias] = $mappedConf['mapFieldNames'][$fieldInfo['primaryKeys'][$mappedTable]];
- } else {
- $fieldInfo['primaryKeys'][$mappedTableAlias] = $fieldInfo['primaryKeys'][$mappedTable];
- }
- }
- }
- }
- return $fieldInfo;
- }
- /************************************
- *
- * Query Building (Overriding parent methods)
- * These functions are extending counterparts in the parent class.
- *
- **************************************/
- /* From the ADOdb documentation, this is what we do (_Execute for SELECT, _query for the other actions)
- Execute() is the default way to run queries. You can use the low-level functions _Execute() and _query() to reduce query overhead.
- Both these functions share the same parameters as Execute().
- If you do not have any bind parameters or your database supports binding (without emulation), then you can call _Execute() directly.
- Calling this function bypasses bind emulation. Debugging is still supported in _Execute().
- If you do not require debugging facilities nor emulated binding, and do not require a recordset to be returned, then you can call _query.
- This is great for inserts, updates and deletes. Calling this function bypasses emulated binding, debugging, and recordset handling. Either
- the resultid, TRUE or FALSE are returned by _query().
- */
- /**
- * Inserts a record for $table from the array with field/value pairs $fields_values.
- *
- * @param string Table name
- * @param array Field values as key=>value pairs. Values will be escaped internally. Typically you would fill an array like "$insertFields" with 'fieldname'=>'value' and pass it to this function as argument.
- * @param mixed List/array of keys NOT to quote (eg. SQL functions)
- * @return mixed Result from handler, usually TRUE when success and FALSE on failure
- */
- public function exec_INSERTquery($table, $fields_values, $no_quote_fields = '') {
- if ($this->debug) {
- $pt = t3lib_div::milliseconds();
- }
- // Do field mapping if needed:
- $ORIG_tableName = $table;
- if ($tableArray = $this->map_needMapping($table)) {
- // Field mapping of array:
- $fields_values = $this->map_assocArray($fields_values, $tableArray);
- // Table name:
- if ($this->mapping[$table]['mapTableName']) {
- $table = $this->mapping[$table]['mapTableName'];
- }
- }
- // Select API:
- $this->lastHandlerKey = $this->handler_getFromTableList($ORIG_tableName);
- switch ((string)$this->handlerCfg[$this->lastHandlerKey]['type']) {
- case 'native':
- $this->lastQuery = $this->INSERTquery($table,$fields_values,$no_quote_fields);
- if (is_string($this->lastQuery)) {
- $sqlResult = mysql_query($this->lastQuery, $this->handlerInstance[$this->lastHandlerKey]['link']);
- } else {
- $sqlResult = mysql_query($this->lastQuery[0], $this->handlerInstance[$this->lastHandlerKey]['link']);
- foreach ($this->lastQuery[1] as $field => $content) {
- mysql_query('UPDATE ' . $this->quoteFromTables($table) . ' SET ' . $this->quoteFromTables($field) . '=' . $this->fullQuoteStr($content, $table) . ' WHERE ' . $this->quoteWhereClause($where), $this->handlerInstance[$this->lastHandlerKey]['link']);
- }
- }
- break;
- case 'adodb':
- // auto generate ID for auto_increment fields if not present (static import needs this!)
- // should we check the table name here (static_*)?
- if (isset($this->cache_autoIncFields[$table])) {
- if (isset($fields_values[$this->cache_autoIncFields[$table]])) {
- $new_id = $fields_values[$this->cache_autoIncFields[$table]];
- if ($table != 'tx_dbal_debuglog') {
- $this->handlerInstance[$this->lastHandlerKey]->last_insert_id = $new_id;
- }
- } else {
- $new_id = $this->handlerInstance[$this->lastHandlerKey]->GenID($table.'_'.$this->cache_autoIncFields[$table], $this->handlerInstance[$this->lastHandlerKey]->sequenceStart);
- $fields_values[$this->cache_autoIncFields[$table]] = $new_id;
- if ($table != 'tx_dbal_debuglog') {
- $this->handlerInstance[$this->lastHandlerKey]->last_insert_id = $new_id;
- }
- }
- }
- $this->lastQuery = $this->INSERTquery($table,$fields_values,$no_quote_fields);
- if (is_string($this->lastQuery)) {
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_query($this->lastQuery,FALSE);
- } else {
- $this->handlerInstance[$this->lastHandlerKey]->StartTrans();
- if (strlen($this->lastQuery[0])) {
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_query($this->lastQuery[0],FALSE);
- }
- if (is_array($this->lastQuery[1])) {
- foreach ($this->lastQuery[1] as $field => $content) {
- if (empty($content)) continue;
- if (isset($this->cache_autoIncFields[$table]) && isset($new_id)) {
- $this->handlerInstance[$this->lastHandlerKey]->UpdateBlob($this->quoteFromTables($table),$field,$content,$this->quoteWhereClause($this->cache_autoIncFields[$table].'='.$new_id));
- } elseif (isset($this->cache_primaryKeys[$table])) {
- $where = '';
- $pks = explode(',', $this->cache_primaryKeys[$table]);
- foreach ($pks as $pk) {
- if (isset($fields_values[$pk]))
- $where .= $pk.'='.$this->fullQuoteStr($fields_values[$pk], $table).' AND ';
- }
- $where = $this->quoteWhereClause($where.'1=1');
- $this->handlerInstance[$this->lastHandlerKey]->UpdateBlob($this->quoteFromTables($table),$field,$content,$where);
- } else {
- $this->handlerInstance[$this->lastHandlerKey]->CompleteTrans(FALSE);
- die('Could not update BLOB >>>> no WHERE clause found!'); // should never ever happen
- }
- }
- }
- if (is_array($this->lastQuery[2])) {
- foreach ($this->lastQuery[2] as $field => $content) {
- if (empty($content)) continue;
- if (isset($this->cache_autoIncFields[$table]) && isset($new_id)) {
- $this->handlerInstance[$this->lastHandlerKey]->UpdateClob($this->quoteFromTables($table),$field,$content,$this->quoteWhereClause($this->cache_autoIncFields[$table].'='.$new_id));
- } elseif (isset($this->cache_primaryKeys[$table])) {
- $where = '';
- $pks = explode(',', $this->cache_primaryKeys[$table]);
- foreach ($pks as $pk) {
- if (isset($fields_values[$pk]))
- $where .= $pk.'='.$this->fullQuoteStr($fields_values[$pk], $table).' AND ';
- }
- $where = $this->quoteWhereClause($where.'1=1');
- $this->handlerInstance[$this->lastHandlerKey]->UpdateClob($this->quoteFromTables($table),$field,$content,$where);
- } else {
- $this->handlerInstance[$this->lastHandlerKey]->CompleteTrans(FALSE);
- die('Could not update CLOB >>>> no WHERE clause found!'); // should never ever happen
- }
- }
- }
- $this->handlerInstance[$this->lastHandlerKey]->CompleteTrans();
- }
- break;
- case 'userdefined':
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->exec_INSERTquery($table,$fields_values,$no_quote_fields);
- break;
- }
- if ($this->printErrors && $this->sql_error()) {
- debug(array($this->lastQuery, $this->sql_error()));
- }
- if ($this->debug) {
- $this->debugHandler(
- 'exec_INSERTquery',
- t3lib_div::milliseconds()-$pt,
- array(
- 'handlerType' => $hType,
- 'args' => array($table,$fields_values),
- 'ORIG_tablename' => $ORIG_tableName
- )
- );
- }
- // Return output:
- return $sqlResult;
- }
- /**
- * Creates and executes an INSERT SQL-statement for $table with multiple rows.
- * This method uses exec_INSERTquery() and is just a syntax wrapper to it.
- *
- * @param string Table name
- * @param array Field names
- * @param array Table rows. Each row should be an array with field values mapping to $fields
- * @param string/array See fullQuoteArray()
- * @return mixed Result from last handler, usually TRUE when success and FALSE on failure
- */
- public function exec_INSERTmultipleRows($table, array $fields, array $rows, $no_quote_fields = FALSE) {
- if ((string)$this->handlerCfg[$this->lastHandlerKey]['type'] === 'native') {
- return parent::exec_INSERTmultipleRows($table, $fields, $rows, $no_quote_fields);
- }
- foreach ($rows as $row) {
- $fields_values = array();
- foreach ($fields as $key => $value) {
- $fields_values[$value] = $row[$key];
- }
- $res = $this->exec_INSERTquery($table, $fields_values, $no_quote_fields);
- }
- return $res;
- }
- /**
- * Updates a record from $table
- *
- * @param string Database tablename
- * @param string WHERE clause, eg. "uid=1". NOTICE: You must escape values in this argument with $this->fullQuoteStr() yourself!
- * @param array Field values as key=>value pairs. Values will be escaped internally. Typically you would fill an array like "$updateFields" with 'fieldname'=>'value' and pass it to this function as argument.
- * @param mixed List/array of keys NOT to quote (eg. SQL functions)
- * @return mixed Result from handler, usually TRUE when success and FALSE on failure
- */
- public function exec_UPDATEquery($table,$where,$fields_values,$no_quote_fields = '') {
- if ($this->debug) {
- $pt = t3lib_div::milliseconds();
- }
- // Do table/field mapping:
- $ORIG_tableName = $table;
- if ($tableArray = $this->map_needMapping($table)) {
- // Field mapping of array:
- $fields_values = $this->map_assocArray($fields_values,$tableArray);
- // Where clause table and field mapping:
- $whereParts = $this->SQLparser->parseWhereClause($where);
- $this->map_sqlParts($whereParts,$tableArray[0]['table']);
- $where = $this->SQLparser->compileWhereClause($whereParts, FALSE);
- // Table name:
- if ($this->mapping[$table]['mapTableName']) {
- $table = $this->mapping[$table]['mapTableName'];
- }
- }
- // Select API
- $this->lastHandlerKey = $this->handler_getFromTableList($ORIG_tableName);
- switch ((string)$this->handlerCfg[$this->lastHandlerKey]['type']) {
- case 'native':
- $this->lastQuery = $this->UPDATEquery($table,$where,$fields_values,$no_quote_fields);
- if (is_string($this->lastQuery)) {
- $sqlResult = mysql_query($this->lastQuery, $this->handlerInstance[$this->lastHandlerKey]['link']);
- }
- else {
- $sqlResult = mysql_query($this->lastQuery[0], $this->handlerInstance[$this->lastHandlerKey]['link']);
- foreach ($this->lastQuery[1] as $field => $content) {
- mysql_query('UPDATE '.$this->quoteFromTables($table).' SET '.$this->quoteFromTables($field).'='.$this->fullQuoteStr($content,$table).' WHERE '.$this->quoteWhereClause($where), $this->handlerInstance[$this->lastHandlerKey]['link']);
- }
- }
- break;
- case 'adodb':
- $this->lastQuery = $this->UPDATEquery($table,$where,$fields_values,$no_quote_fields);
- if (is_string($this->lastQuery)) {
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_query($this->lastQuery,FALSE);
- } else {
- $this->handlerInstance[$this->lastHandlerKey]->StartTrans();
- if (strlen($this->lastQuery[0])) {
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_query($this->lastQuery[0],FALSE);
- }
- if (is_array($this->lastQuery[1])) {
- foreach ($this->lastQuery[1] as $field => $content) {
- $this->handlerInstance[$this->lastHandlerKey]->UpdateBlob($this->quoteFromTables($table),$field,$content,$this->quoteWhereClause($where));
- }
- }
- if (is_array($this->lastQuery[2])) {
- foreach ($this->lastQuery[2] as $field => $content) {
- $this->handlerInstance[$this->lastHandlerKey]->UpdateClob($this->quoteFromTables($table),$field,$content,$this->quoteWhereClause($where));
- }
- }
- $this->handlerInstance[$this->lastHandlerKey]->CompleteTrans();
- }
- break;
- case 'userdefined':
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->exec_UPDATEquery($table,$where,$fields_values,$no_quote_fields);
- break;
- }
- if ($this->printErrors && $this->sql_error()) {
- debug(array($this->lastQuery, $this->sql_error()));
- }
- if ($this->debug) {
- $this->debugHandler(
- 'exec_UPDATEquery',
- t3lib_div::milliseconds()-$pt,
- array(
- 'handlerType' => $hType,
- 'args' => array($table,$where, $fields_values),
- 'ORIG_from_table' => $ORIG_tableName
- )
- );
- }
- // Return result:
- return $sqlResult;
- }
- /**
- * Deletes records from table
- *
- * @param string Database tablename
- * @param string WHERE clause, eg. "uid=1". NOTICE: You must escape values in this argument with $this->fullQuoteStr() yourself!
- * @return mixed Result from handler
- */
- public function exec_DELETEquery($table, $where) {
- if ($this->debug) {
- $pt = t3lib_div::milliseconds();
- }
- // Do table/field mapping:
- $ORIG_tableName = $table;
- if ($tableArray = $this->map_needMapping($table)) {
- // Where clause:
- $whereParts = $this->SQLparser->parseWhereClause($where);
- $this->map_sqlParts($whereParts,$tableArray[0]['table']);
- $where = $this->SQLparser->compileWhereClause($whereParts, FALSE);
- // Table name:
- if ($this->mapping[$table]['mapTableName']) {
- $table = $this->mapping[$table]['mapTableName'];
- }
- }
- // Select API
- $this->lastHandlerKey = $this->handler_getFromTableList($ORIG_tableName);
- switch ((string)$this->handlerCfg[$this->lastHandlerKey]['type']) {
- case 'native':
- $this->lastQuery = $this->DELETEquery($table,$where);
- $sqlResult = mysql_query($this->lastQuery, $this->handlerInstance[$this->lastHandlerKey]['link']);
- break;
- case 'adodb':
- $this->lastQuery = $this->DELETEquery($table,$where);
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_query($this->lastQuery,FALSE);
- break;
- case 'userdefined':
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->exec_DELETEquery($table,$where);
- break;
- }
- if ($this->printErrors && $this->sql_error()) {
- debug(array($this->lastQuery, $this->sql_error()));
- }
- if ($this->debug) {
- $this->debugHandler(
- 'exec_DELETEquery',
- t3lib_div::milliseconds()-$pt,
- array(
- 'handlerType' => $hType,
- 'args' => array($table,$where),
- 'ORIG_from_table' => $ORIG_tableName
- )
- );
- }
- // Return result:
- return $sqlResult;
- }
- /**
- * Selects records from Data Source
- *
- * @param string $select_fields List of fields to select from the table. This is what comes right after "SELECT ...". Required value.
- * @param string $from_table Table(s) from which to select. This is what comes right after "FROM ...". Required value.
- * @param string $where_clause Optional additional WHERE clauses put in the end of the query. NOTICE: You must escape values in this argument with $this->fullQquoteStr() yourself! DO NOT PUT IN GROUP BY, ORDER BY or LIMIT!
- * @param string $groupBy Optional GROUP BY field(s), if none, supply blank string.
- * @param string $orderBy Optional ORDER BY field(s), if none, supply blank string.
- * @param string $limit Optional LIMIT value ([begin,]max), if none, supply blank string.
- * @return mixed Result from handler. Typically object from DBAL layers.
- */
- public function exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $limit = '') {
- if ($this->debug) {
- $pt = t3lib_div::milliseconds();
- }
- // Map table / field names if needed:
- $ORIG_tableName = $from_table; // Saving table names in $ORIG_from_table since $from_table is transformed beneath:
- if ($tableArray = $this->map_needMapping($ORIG_tableName)) {
- $this->map_remapSELECTQueryParts($select_fields,$from_table,$where_clause,$groupBy,$orderBy); // Variables passed by reference!
- }
- // Get handler key and select API:
- $this->lastHandlerKey = $this->handler_getFromTableList($ORIG_tableName);
- $hType = (string)$this->handlerCfg[$this->lastHandlerKey]['type'];
- switch ($hType) {
- case 'native':
- $this->lastQuery = $this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit);
- $sqlResult = mysql_query($this->lastQuery, $this->handlerInstance[$this->lastHandlerKey]['link']);
- $this->resourceIdToTableNameMap[(string)$sqlResult] = $ORIG_tableName;
- break;
- case 'adodb':
- if ($limit != '') {
- $splitLimit = t3lib_div::intExplode(',', $limit); // Splitting the limit values:
- if ($splitLimit[1]) { // If there are two parameters, do mapping differently than otherwise:
- $numrows = $splitLimit[1];
- $offset = $splitLimit[0];
- } else {
- $numrows = $splitLimit[0];
- $offset = 0;
- }
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->SelectLimit($this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy), $numrows, $offset);
- $this->lastQuery = $sqlResult->sql;
- } else {
- $this->lastQuery = $this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy);
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_Execute($this->lastQuery);
- }
- $sqlResult->TYPO3_DBAL_handlerType = 'adodb'; // Setting handler type in result object (for later recognition!)
- $sqlResult->TYPO3_DBAL_tableList = $ORIG_tableName;
- break;
- case 'userdefined':
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit);
- if (is_object($sqlResult)) {
- $sqlResult->TYPO3_DBAL_handlerType = 'userdefined'; // Setting handler type in result object (for later recognition!)
- $sqlResult->TYPO3_DBAL_tableList = $ORIG_tableName;
- }
- break;
- }
- if ($this->printErrors && $this->sql_error()) {
- debug(array($this->lastQuery, $this->sql_error()));
- }
- if ($this->debug) {
- $this->debugHandler(
- 'exec_SELECTquery',
- t3lib_div::milliseconds()-$pt,
- array(
- 'handlerType' => $hType,
- 'args' => array($from_table,$select_fields,$where_clause,$groupBy,$orderBy,$limit),
- 'ORIG_from_table' => $ORIG_tableName
- )
- );
- }
- // Return result handler.
- return $sqlResult;
- }
- /**
- * Truncates a table.
- *
- * @param string Database tablename
- * @return mixed Result from handler
- */
- public function exec_TRUNCATEquery($table) {
- if ($this->debug) {
- $pt = t3lib_div::milliseconds();
- }
- // Do table/field mapping:
- $ORIG_tableName = $table;
- if ($tableArray = $this->map_needMapping($table)) {
- // Table name:
- if ($this->mapping[$table]['mapTableName']) {
- $table = $this->mapping[$table]['mapTableName'];
- }
- }
- // Select API
- $this->lastHandlerKey = $this->handler_getFromTableList($ORIG_tableName);
- switch ((string)$this->handlerCfg[$this->lastHandlerKey]['type']) {
- case 'native':
- $this->lastQuery = $this->TRUNCATEquery($table);
- $sqlResult = mysql_query($this->lastQuery, $this->handlerInstance[$this->lastHandlerKey]['link']);
- break;
- case 'adodb':
- $this->lastQuery = $this->TRUNCATEquery($table);
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->_query($this->lastQuery, FALSE);
- break;
- case 'userdefined':
- $sqlResult = $this->handlerInstance[$this->lastHandlerKey]->exec_TRUNCATEquery($table,$where);
- break;
- }
- if ($this->printErrors && $this->sql_error()) {
- debug(array($this->lastQuery, $this->sql_error()));
- }
- if ($this->debug) {
- $this->debugHandler(
- 'exec_TRUNCATEquery',
- t3lib_div::milliseconds() - $pt,
- array(
- 'handlerType' => $hType,
- 'args' => array($table),
- 'ORIG_from_table' => $ORIG_tableName
- )
- );
- }
- // Return result:
- return $sqlResult;
- }
- /**
- * Executes a query.
- * EXPERIMENTAL since TYPO3 4.4.
- *
- * @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);
- case 'TRUNCATETABLE':
- $table = $queryParts['TABLE'];
- return $this->exec_TRUNCATEquery($table);
- }
- }
- /**************************************
- *
- * Query building
- *
- **************************************/
- /**
- * Creates an INSERT SQL-statement for $table from the array with field/value pairs $fields_values.
- * Usage count/core: 4
- *
- * @param string See exec_INSERTquery()
- * @param array See exec_INSERTquery()
- * @param mixed See exec_INSERTquery()
- * @return mixed Full SQL query for INSERT as string or array (unless $fields_values does not contain any elements in which case it will be FALSE). If BLOB fields will be affected and one is not running the native type, an array will be returned, where 0 => plain SQL, 1 => fieldname/value pairs of BLOB fields
- */
- public function INSERTquery($table, $fields_values, $no_quote_fields = '') {
- // Table and fieldnames should be "SQL-injection-safe" when supplied to this function (contrary to values in the arrays which may be insecure).
- if (is_array($fields_values) && count($fields_values)) {
- if (is_string($no_quote_fields)) {
- $no_quote_fields = explode(',', $no_quote_fields);
- } elseif (!is_array($no_quote_fields)) {
- $no_quote_fields = array();
- }
- $blobfields = array();
- $nArr = array();
- foreach ($fields_values as $k => $v) {
- if (!$this->runningNative() && $this->sql_field_metatype($table, $k) == 'B') {
- // we skip the field in the regular INSERT statement, it is only in blobfields
- $blobfields[$this->quoteFieldNames($k)] = $v;
- } elseif (!$this->runningNative() && $this->sql_field_metatype($table, $k) == 'XL') {
- // we skip the field in the regular INSERT statement, it is only in clobfields
- $clobfields[$this->quoteFieldNames($k)] = $v;
- } else {
- // Add slashes old-school:
- // cast numerical values
- $mt = $this->sql_field_metatype($table, $k);
- if ($mt{0} == 'I') {
- $v = (int)$v;
- } else if ($mt{0} == 'F') {
- $v = (double)$v;
- }
- $nArr[$this->quoteFieldNames($k)] = (!in_array($k,$no_quote_fields)) ? $this->fullQuoteStr($v, $table) : $v;
- }
- }
- if (count($blobfields) || count($clobfields)) {
- if (count($nArr)) {
- $query[0] = 'INSERT INTO ' . $this->quoteFromTables($table) . '
- (
- ' . implode(',
- ', array_keys($nArr)) . '
- ) VALUES (
- ' . implode(',
- ', $nArr) . '
- )';
- }
- if (count($blobfields)) $query[1] = $blobfields;
- if (count($clobfields)) $query[2] = $clobfields;
- if ($this->debugOutput || $this->store_lastBuiltQuery) $this->debug_lastBuiltQuery = $query[0];
- } else {
- $query = 'INSERT INTO '.$this->quoteFromTables($table).'
- (
- ' . implode(',
- ', array_keys($nArr)) . '
- ) VALUES (
- ' . implode(',
- ', $nArr) . '
- )';
- if ($this->debugOutput || $this->store_lastBuiltQuery) $this->debug_lastBuiltQuery = $query;
- }
- return $query;
- }
- }
- /**
- * Creates an INSERT SQL-statement for $table with multiple rows.
- * This method will create multiple INSERT queries concatenated with ';'
- *
- * @param string Table name
- * @param array Field names
- * @param array Table rows. Each row should be an array with field values mapping to $fields
- * @param string/array See fullQuoteArray()
- * @return array Full SQL query for INSERT as array of strings (unless $fields_values does not contain any elements in which case it will be FALSE). If BLOB fields will be affected and one is not running the native type, an array will be returned for each row, where 0 => plain SQL, 1 => fieldname/value pairs of BLOB fields.
- */
- public function INSERTmultipleRows($table, array $fields, array $rows, $no_quote_fields = FALSE) {
- if ((string)$this->handlerCfg[$this->lastHandlerKey]['type'] === 'native') {
- return parent::INSERTmultipleRows($table, $fields, $rows, $no_quote_fields);
- }
- $result = array();
- foreach ($rows as $row) {
- $fields_values = array();
- foreach ($fields as $key => $value) {
- $fields_values[$value] = $row[$key];
- }
- $rowQuery = $this->INSERTquery($table, $fields_values, $no_quote_fields);
- if (is_array($rowQuery)) {
- $result[] = $rowQuery;
- } else {
- $result[][0] = $rowQuery;
- }
- }
- return $result;
- }
- /**
- * Creates an UPDATE SQL-statement for $table where $where-clause (typ. 'uid=...') from the array with field/value pairs $fields_values.
- * Usage count/core: 6
- *
- * @param string See exec_UPDATEquery()
- * @param string See exec_UPDATEquery()
- * @param array See exec_UPDATEquery()
- * @param mixed See exec_UPDATEquery()
- * @return mixed Full SQL query for UPDATE as string or array (unless $fields_values does not contain any elements in which case it will be FALSE). If BLOB fields will be affected and one is not running the native type, an array will be returned, where 0 => plain SQL, 1 => fieldname/value pairs of BLOB fields
- */
- public function UPDATEquery($table, $where, $fields_values, $no_quote_fields = '') {
- // Table and fieldnames should be "SQL-injection-safe" when supplied to this function (contrary to values in the arrays which may be insecure).
- if (is_string($where)) {
- $fields = array();
- $blobfields = array();
- $clobfields = array();
- if (is_array($fields_values) && count($fields_values)) {
- if (is_string($no_quote_fields)) {
- $no_quote_fields = explode(',', $no_quote_fields);
- } elseif (!is_array($no_quote_fields)) {
- $no_quote_fields = array();
- }
- $nArr = array();
- foreach ($fields_values as $k => $v) {
- if (!$this->runningNative() && $this->sql_field_metatype($table, $k) == 'B') {
- // we skip the field in the regular UPDATE statement, it is only in blobfields
- $blobfields[$this->quoteFieldNames($k)] = $v;
- } elseif (!$this->runningNative() && $this->sql_field_metatype($table, $k) == 'XL') {
- // we skip the field in the regular UPDATE statement, it is only in clobfields
- $clobfields[$this->quoteFieldNames($k)] = $v;
- } else {
- // Add slashes old-school:
- // cast numeric values
- $mt = $this->sql_field_metatype($table, $k);
- if ($mt{0} == 'I') {
- $v = (int)$v;
- } else if ($mt{0} == 'F') {
- $v = (double)$v;
- }
- $nArr[] = $this->quoteFieldNames($k) . '=' . ((!in_array($k, $no_quote_fields)) ? $this->fullQuoteStr($v, $table) : $v);
- }
- }
- }
- if (count($blobfields) || count($clobfields)) {
- if (count($nArr)) {
- $query[0] = 'UPDATE ' . $this->quoteFromTables($table) . '
- SET
- ' . implode(',
- ', $nArr) .
- (strlen($where) > 0 ? '
- WHERE
- ' . $this->quoteWhereClause($where) : '');
- }
- if (count($blobfields)) {
- $query[1] = $blobfields;
- }
- if (count($clobfields)) {
- $query[2] = $clobfields;
- }
- if ($this->debugOutput || $this->store_lastBuiltQuery) {
- $this->debug_lastBuiltQuery = $query[0];
- }
- } else {
- $query = 'UPDATE ' . $this->quoteFromTables($table) . '
- SET
- ' . implode(',
- ', $nArr) .
- (strlen($where) > 0 ? '
- WHERE
- ' . $this->quoteWhereClause($where) : '');
- if ($this->debugOutput || $this->store_lastBuiltQuery) {
- $this->debug_lastBuiltQuery = $query;
- }
- }
- return $query;
- } else {
- throw new InvalidArgumentException(
- 'TYPO3 Fatal Error: "Where" clause argument for UPDATE query was not a string in $this->UPDATEquery() !',
- 1270853880
- );
- }
- }
- /**
- * Creates a DELETE SQL-statement for $table where $where-clause
- * Usage count/core: 3
- *
- * @param string See exec_DELETEquery()
- * @param string See exec_DELETEquery()
- * @return string Full SQL query for DELETE
- */
- public function DELETEquery($table, $where) {
- if (is_string($where)) {
- $table = $this->quoteFromTables($table);
- $where = $this->quoteWhereClause($where);
- $query = parent::DELETEquery($table, $where);
- if ($this->debugOutput || $this->store_lastBuiltQuery) $this->debug_lastBuiltQuery = $query;
- return $query;
- } else {
- die('<strong>TYPO3 Fatal Error:</strong> "Where" clause argument for DELETE query was not a string in $this->DELETEquery() !');
- }
- }
- /**
- * Creates a SELECT SQL-statement
- * Usage count/core: 11
- *
- * @param string See exec_SELECTquery()
- * @param string See exec_SELECTquery()
- * @param string See exec_SELECTquery()
- * @param string See exec_SELECTquery()
- * @param string See exec_SELECTquery()
- * @param string See exec_SELECTquery()
- * @return string Full SQL query for SELECT
- */
- public function SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $limit = '') {
- $this->lastHandlerKey = $this->handler_getFromTableList($from_table);
- $hType = (string)$this->handlerCfg[$this->lastHandlerKey]['type'];
- if ($hType === 'adodb' && $this->runningADOdbDriver('postgres')) {
- // Possibly rewrite the LIMIT to be PostgreSQL-compatible
- $splitLimit = t3lib_div::intExplode(',', $limit); // Splitting the limit values:
- if ($splitLimit[1]) { // If there are two parameters, do mapping differently than otherwise:
- $numrows = $splitLimit[1];
- $offset = $splitLimit[0];
- $limit = $numrows . ' OFFSET ' . $offset;
- }
- }
-
- $select_fields = $this->quoteFieldNames($select_fields);
- $from_table = $this->quoteFromTables($from_table);
- $where_clause = $this->quoteWhereClause($where_clause);
- $groupBy = $this->quoteGroupBy($groupBy);
- $orderBy = $this->quoteOrderBy($orderBy);
- // Call parent method to build actual query
- $query = parent::SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit);
- if ($this->debugOutput || $this->store_lastBuiltQuery) $this->debug_lastBuiltQuery = $query;
- return $query;
- }
- /**
- * Creates a TRUNCATE TABLE SQL-statement
- *
- * @param string See exec_TRUNCATEquery()
- * @return string Full SQL query for TRUNCATE TABLE
- */
- public function TRUNCATEquery($table) {
- $table = $this->quoteFromTables($table);
- // Call parent method to build actual query
- $query = parent::TRUNCATEquery($table);
- if ($this->debugOutput || $this->store_lastBuiltQuery) {
- $this->debug_lastBuiltQuery = $query;
- }
- return $query;
- }
- /**************************************
- *
- * Functions for quoting table/field names
- *
- **************************************/
- /**
- * Quotes components of a SELECT subquery.
- *
- * @param array $components Array of SQL query components
- * @return array
- */
- protected function quoteSELECTsubquery(array $components) {
- $components['SELECT'] = $this->_quoteFieldNames($components['SELECT']);
- $components['FROM'] = $this->_quoteFromTables($components['FROM']);
- $components['WHERE'] = $this->_quoteWhereClause($components['WHERE']);
- return $components;
- }
- /**
- * Quotes field (and table) names with the quote character suitable for the DB being used
- * Use quoteFieldNames instead!
- *
- * @param string List of fields to be selected from DB
- * @return string Quoted list of fields to be selected from DB
- * @deprecated since TYPO3 4.0
- */
- public function quoteSelectFields($select_fields) {
- $this->quoteFieldNames($select_fields);
- }
- /**
- * Quotes field (and table) names with the quote character suitable for the DB being used
- *
- * @param string List of fields to be used in query to DB
- * @return string Quoted list of fields to be in query to DB
- */
- public function quoteFieldNames($select_fields) {
- if ($select_fields == '') return '';
- if ($this->runningNative()) return $select_fields;
- $select_fields = $this->SQLparser->parseFieldList($select_fields);
- if ($this->SQLparser->parse_error) {
- die($this->SQLparser->parse_error . ' in ' . __FILE__ . ' : ' . __LINE__);
- }
- $select_fields = $this->_quoteFieldNames($select_fields);
- return $this->SQLparser->compileFieldList($select_fields);
- }
- /**
- * Quotes field (and table) names in a SQL SELECT clause acccording to DB rules
- *
- * @param array $select_fields The parsed fields to quote
- * @return array
- * @see quoteFieldNames()
- */
- protected function _quoteFieldNames(array $select_fields) {
- foreach ($select_fields as $k => $v) {
- if ($select_fields[$k]['field'] != '' && $select_fields[$k]['field'] != '*' && !is_numeric($select_fields[$k]['field'])) {
- $select_fields[$k]['field'] = $this->quoteName($select_fields[$k]['field']);
- }
- if ($select_fields[$k]['table'] != '' && !is_numeric($select_fields[$k]['table'])) {
- $select_fields[$k]['table'] = $this->quoteName($select_fields[$k]['table']);
- }
- if ($select_fields[$k]['as'] != '') {
- $select_fields[$k]['as'] = $this->quoteName($select_fields[$k]['as']);
- }
- if (isset($select_fields[$k]['func_content.']) && $select_fields[$k]['func_content.'][0]['func_content'] != '*'){
- $select_fields[$k]['func_content.'][0]['func_content'] = $this->quoteFieldNames($select_fields[$k]['func_content.'][0]['func_content']);
- $select_fields[$k]['func_content'] = $this->quoteFieldNames($select_fields[$k]['func_content']);
- }
- if (isset($select_fields[$k]['flow-control'])) {
- // Quoting flow-control statements
- if ($select_fields[$k]['flow-control']['type'] === 'CASE') {
- if (isset($select_fields[$k]['flow-control']['case_field'])) {
- $select_fields[$k]['flow-control']['case_field'] = $this->quoteFieldNames($select_fields[$k]['flow-control']['case_field']);
- }
- foreach ($select_fields[$k]['flow-control']['when'] as $key => $when) {
- $select_fields[$k]['flow-control']['when'][$key]['when_value'] = $this->_quoteWhereClause($when['when_value']);
- }
- }
- }
- }
- return $select_fields;
- }
- /**
- * Quotes table names with the quote character suitable for the DB being used
- *
- * @param string List of tables to be selected from DB
- * @return string Quoted list of tables to be selected from DB
- */
- public function quoteFromTables($from_table) {
- if ($from_table == '') return '';
- if ($this->runningNative()) return $from_table;
- $from_table = $this->SQLparser->parseFromTables($from_table);
- $from_table = $this->_quoteFromTables($from_table);
- return $this->SQLparser->compileFromTables($from_table);
- }
- /**
- * Quotes table names in a SQL FROM clause acccording to DB rules
- *
- * @param array $from_table The parsed FROM clause to quote
- * @return array
- * @see quoteFromTables()
- */
- protected function _quoteFromTables(array $from_table) {
- foreach ($from_table as $k => $v) {
- $from_table[$k]['table'] = $this->quoteName($from_table[$k]['table']);
- if ($from_table[$k]['as'] != '') {
- $from_table[$k]['as'] = $this->quoteName($from_table[$k]['as']);
- }
- if (is_array($v['JOIN'])) {
- foreach ($v['JOIN'] as $joinCnt => $join) {
- $from_table[$k]['JOIN'][$joinCnt]['withTable'] = $this->quoteName($join['withTable']);
- $from_table[$k]['JOIN'][$joinCnt]['as'] = ($join['as']) ? $this->quoteName($join['as']) : '';
- foreach ($from_table[$k]['JOIN'][$joinCnt]['ON'] as &$condition) {
- $condition['left']['table'] = ($condition['left']['table']) ? $this->quoteName($condition['left']['table']) : '';
- $condition['left']['field'] = $this->quoteName($condition['left']['field']);
- $condition['right']['table'] = ($condition['right'…
Large files files are truncated, but you can click here to view the full file