Moved to PHP folder
This commit is contained in:
		
							
								
								
									
										11
									
								
								php/system/database/drivers/pdo/subdrivers/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								php/system/database/drivers/pdo/subdrivers/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										200
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,200 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO 4D Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_4d_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = '4d'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Identifier escape character | ||||
| 	 * | ||||
| 	 * @var	string[] | ||||
| 	 */ | ||||
| 	protected $_escape_char = array('[', ']'); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
|  | ||||
| 			empty($this->port) OR $this->dsn .= ';port='.$this->port; | ||||
| 			empty($this->database) OR $this->dsn .= ';dbname='.$this->database; | ||||
| 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 		elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE) | ||||
| 		{ | ||||
| 			$this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES'); | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			$sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS') | ||||
| 			.' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _field_data($table) | ||||
| 	{ | ||||
| 		return 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		$this->qb_orderby = array(); | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										217
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,217 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO 4D Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_4d_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_database	= 'CREATE SCHEMA %s'; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_database	= 'DROP SCHEMA %s'; | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_table_if	= 'CREATE TABLE IF NOT EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * RENAME TABLE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_rename_table	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= 'DROP TABLE IF EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'INT16'		=> 'INT', | ||||
| 		'SMALLINT'	=> 'INT', | ||||
| 		'INT'		=> 'INT64', | ||||
| 		'INT32'		=> 'INT64' | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * DEFAULT value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_default		= FALSE; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		// No method of modifying columns is supported | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process column | ||||
| 	 * | ||||
| 	 * @param	array	$field | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_column($field) | ||||
| 	{ | ||||
| 		return $this->db->escape_identifiers($field['name']) | ||||
| 			.' '.$field['type'].$field['length'] | ||||
| 			.$field['null'] | ||||
| 			.$field['unique'] | ||||
| 			.$field['auto_increment']; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'SMALLINT'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'INTEGER': | ||||
| 				$attributes['TYPE'] = 'INT'; | ||||
| 				return; | ||||
| 			case 'BIGINT': | ||||
| 				$attributes['TYPE'] = 'INT64'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute UNIQUE | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_unique(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) | ||||
| 		{ | ||||
| 			$field['unique'] = ' UNIQUE'; | ||||
|  | ||||
| 			// UNIQUE must be used with NOT NULL | ||||
| 			$field['null'] = ' NOT NULL'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 		{ | ||||
| 			if (stripos($field['type'], 'int') !== FALSE) | ||||
| 			{ | ||||
| 				$field['auto_increment'] = ' AUTO_INCREMENT'; | ||||
| 			} | ||||
| 			elseif (strcasecmp($field['type'], 'UUID') === 0) | ||||
| 			{ | ||||
| 				$field['auto_increment'] = ' AUTO_GENERATE'; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										209
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,209 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO CUBRID Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'cubrid'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Identifier escape character | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_escape_char = '`'; | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('RANDOM()', 'RANDOM(%d)'); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
|  | ||||
| 			empty($this->port) OR $this->dsn .= ';port='.$this->port; | ||||
| 			empty($this->database) OR $this->dsn .= ';dbname='.$this->database; | ||||
| 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SHOW TABLES'; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		$query = $query->result_object(); | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]->Field; | ||||
|  | ||||
| 			sscanf($query[$i]->Type, '%[a-z](%d)', | ||||
| 				$retval[$i]->type, | ||||
| 				$retval[$i]->max_length | ||||
| 			); | ||||
|  | ||||
| 			$retval[$i]->default		= $query[$i]->Default; | ||||
| 			$retval[$i]->primary_key	= (int) ($query[$i]->Key === 'PRI'); | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * | ||||
| 	 * If the database does not support the TRUNCATE statement, | ||||
| 	 * then this method maps to 'DELETE FROM table' | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _truncate($table) | ||||
| 	{ | ||||
| 		return 'TRUNCATE '.$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * FROM tables | ||||
| 	 * | ||||
| 	 * Groups tables in FROM clauses if needed, so there is no confusion | ||||
| 	 * about operator precedence. | ||||
| 	 * | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _from_tables() | ||||
| 	{ | ||||
| 		if ( ! empty($this->qb_join) && count($this->qb_from) > 1) | ||||
| 		{ | ||||
| 			return '('.implode(', ', $this->qb_from).')'; | ||||
| 		} | ||||
|  | ||||
| 		return implode(', ', $this->qb_from); | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										230
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,230 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO CUBRID Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_cubrid_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_database	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_database	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE keys flag | ||||
| 	 * | ||||
| 	 * Whether table keys are created from within the | ||||
| 	 * CREATE TABLE statement. | ||||
| 	 * | ||||
| 	 * @var	bool | ||||
| 	 */ | ||||
| 	protected $_create_table_keys	= TRUE; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= 'DROP TABLE IF EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'SHORT'		=> 'INTEGER', | ||||
| 		'SMALLINT'	=> 'INTEGER', | ||||
| 		'INT'		=> 'BIGINT', | ||||
| 		'INTEGER'	=> 'BIGINT', | ||||
| 		'BIGINT'	=> 'NUMERIC', | ||||
| 		'FLOAT'		=> 'DOUBLE', | ||||
| 		'REAL'		=> 'DOUBLE' | ||||
| 	); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); | ||||
| 		$sqls = array(); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if ($field[$i]['_literal'] !== FALSE) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; | ||||
| 				$sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sqls; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process column | ||||
| 	 * | ||||
| 	 * @param	array	$field | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_column($field) | ||||
| 	{ | ||||
| 		$extra_clause = isset($field['after']) | ||||
| 			? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; | ||||
|  | ||||
| 		if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) | ||||
| 		{ | ||||
| 			$extra_clause = ' FIRST'; | ||||
| 		} | ||||
|  | ||||
| 		return $this->db->escape_identifiers($field['name']) | ||||
| 			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) | ||||
| 			.' '.$field['type'].$field['length'] | ||||
| 			.$field['unsigned'] | ||||
| 			.$field['null'] | ||||
| 			.$field['default'] | ||||
| 			.$field['auto_increment'] | ||||
| 			.$field['unique'] | ||||
| 			.$extra_clause; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'SMALLINT'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'LONGTEXT': | ||||
| 				$attributes['TYPE'] = 'STRING'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process indexes | ||||
| 	 * | ||||
| 	 * @param	string	$table	(ignored) | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_indexes($table) | ||||
| 	{ | ||||
| 		$sql = ''; | ||||
|  | ||||
| 		for ($i = 0, $c = count($this->keys); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if (is_array($this->keys[$i])) | ||||
| 			{ | ||||
| 				for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) | ||||
| 				{ | ||||
| 					if ( ! isset($this->fields[$this->keys[$i][$i2]])) | ||||
| 					{ | ||||
| 						unset($this->keys[$i][$i2]); | ||||
| 						continue; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			elseif ( ! isset($this->fields[$this->keys[$i]])) | ||||
| 			{ | ||||
| 				unset($this->keys[$i]); | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); | ||||
|  | ||||
| 			$sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) | ||||
| 				.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; | ||||
| 		} | ||||
|  | ||||
| 		$this->keys = array(); | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										353
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										353
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,353 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO DBLIB Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'dblib'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('NEWID()', 'RAND(%d)'); | ||||
|  | ||||
| 	/** | ||||
| 	 * Quoted identifier flag | ||||
| 	 * | ||||
| 	 * Whether to use SQL-92 standard quoted identifier | ||||
| 	 * (double quotes) or brackets for identifier escaping. | ||||
| 	 * | ||||
| 	 * @var	bool | ||||
| 	 */ | ||||
| 	protected $_quoted_identifier; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
|  | ||||
| 			if ( ! empty($this->port)) | ||||
| 			{ | ||||
| 				$this->dsn .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; | ||||
| 			} | ||||
|  | ||||
| 			empty($this->database) OR $this->dsn .= ';dbname='.$this->database; | ||||
| 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; | ||||
| 			empty($this->appname) OR $this->dsn .= ';appname='.$this->appname; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) | ||||
| 			{ | ||||
| 				$this->dsn .= ';charset='.$this->char_set; | ||||
| 			} | ||||
|  | ||||
| 			$this->subdriver = 'dblib'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database connection | ||||
| 	 * | ||||
| 	 * @param	bool	$persistent | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function db_connect($persistent = FALSE) | ||||
| 	{ | ||||
| 		if ($persistent === TRUE) | ||||
| 		{ | ||||
| 			log_message('debug', "dblib driver doesn't support persistent connections"); | ||||
| 		} | ||||
|  | ||||
| 		$this->conn_id = parent::db_connect(FALSE); | ||||
|  | ||||
| 		if ( ! is_object($this->conn_id)) | ||||
| 		{ | ||||
| 			return $this->conn_id; | ||||
| 		} | ||||
|  | ||||
| 		// Determine how identifiers are escaped | ||||
| 		$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); | ||||
| 		$query = $query->row_array(); | ||||
| 		$this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; | ||||
| 		$this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); | ||||
|  | ||||
| 		return $this->conn_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT '.$this->escape_identifiers('name') | ||||
| 			.' FROM '.$this->escape_identifiers('sysobjects') | ||||
| 			.' WHERE '.$this->escape_identifiers('type')." = 'U'"; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			$sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql.' ORDER BY '.$this->escape_identifiers('name'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT COLUMN_NAME | ||||
| 			FROM INFORMATION_SCHEMA.Columns | ||||
| 			WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT | ||||
| 			FROM INFORMATION_SCHEMA.Columns | ||||
| 			WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); | ||||
|  | ||||
| 		if (($query = $this->query($sql)) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		$query = $query->result_object(); | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]->COLUMN_NAME; | ||||
| 			$retval[$i]->type		= $query[$i]->DATA_TYPE; | ||||
| 			$retval[$i]->max_length		= ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; | ||||
| 			$retval[$i]->default		= $query[$i]->COLUMN_DEFAULT; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		$this->qb_orderby = array(); | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		if ($this->qb_limit) | ||||
| 		{ | ||||
| 			return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; | ||||
| 		} | ||||
|  | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		$limit = $this->qb_offset + $this->qb_limit; | ||||
|  | ||||
| 		// As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, | ||||
| 		// however an ORDER BY clause is required for it to work | ||||
| 		if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) | ||||
| 		{ | ||||
| 			$orderby = $this->_compile_order_by(); | ||||
|  | ||||
| 			// We have to strip the ORDER BY clause | ||||
| 			$sql = trim(substr($sql, 0, strrpos($sql, $orderby))); | ||||
|  | ||||
| 			// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results | ||||
| 			if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) | ||||
| 			{ | ||||
| 				$select = '*'; // Inevitable | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				// Use only field names and their aliases, everything else is out of our scope. | ||||
| 				$select = array(); | ||||
| 				$field_regexp = ($this->_quoted_identifier) | ||||
| 					? '("[^\"]+")' : '(\[[^\]]+\])'; | ||||
| 				for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) | ||||
| 				{ | ||||
| 					$select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) | ||||
| 						? $m[1] : $this->qb_select[$i]; | ||||
| 				} | ||||
| 				$select = implode(', ', $select); | ||||
| 			} | ||||
|  | ||||
| 			return 'SELECT '.$select." FROM (\n\n" | ||||
| 				.preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) | ||||
| 				."\n\n) ".$this->escape_identifiers('CI_subquery') | ||||
| 				."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; | ||||
| 		} | ||||
|  | ||||
| 		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data. | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @param	array	$keys	INSERT keys | ||||
| 	 * @param	array	$values	INSERT values | ||||
| 	 * @return	string|bool | ||||
| 	 */ | ||||
| 	protected function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		// Multiple-value inserts are only supported as of SQL Server 2008 | ||||
| 		if (version_compare($this->version(), '10', '>=')) | ||||
| 		{ | ||||
| 			return parent::_insert_batch($table, $keys, $values); | ||||
| 		} | ||||
|  | ||||
| 		return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database version number | ||||
| 	 * | ||||
| 	 * @return      string | ||||
| 	 */ | ||||
| 	public function version() | ||||
| 	{ | ||||
| 		if (isset($this->data_cache['version'])) | ||||
| 		{ | ||||
| 			return $this->data_cache['version']; | ||||
| 		} | ||||
|  | ||||
| 		return $this->data_cache['version'] = $this->conn_id->query("SELECT SERVERPROPERTY('ProductVersion') AS ver")->fetchColumn(0); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										149
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO DBLIB Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_dblib_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_table_if	= "IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\nCREATE TABLE"; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= "IF EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\nDROP TABLE"; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'TINYINT'	=> 'SMALLINT', | ||||
| 		'SMALLINT'	=> 'INT', | ||||
| 		'INT'		=> 'BIGINT', | ||||
| 		'REAL'		=> 'FLOAT' | ||||
| 	); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; | ||||
| 		$sqls = array(); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$sqls[] = $sql.$this->_process_column($field[$i]); | ||||
| 		} | ||||
|  | ||||
| 		return $sqls; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) | ||||
| 		{ | ||||
| 			unset($attributes['CONSTRAINT']); | ||||
| 		} | ||||
|  | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'INTEGER': | ||||
| 				$attributes['TYPE'] = 'INT'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) | ||||
| 		{ | ||||
| 			$field['auto_increment'] = ' IDENTITY(1,1)'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,279 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO Firebird Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_firebird_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'firebird'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('RAND()', 'RAND()'); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'firebird:'; | ||||
|  | ||||
| 			if ( ! empty($this->database)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'dbname='.$this->database; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->hostname)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'dbname='.$this->hostname; | ||||
| 			} | ||||
|  | ||||
| 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; | ||||
| 			empty($this->role) OR $this->dsn .= ';role='.$this->role; | ||||
| 		} | ||||
| 		elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE) | ||||
| 		{ | ||||
| 			$this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", | ||||
| 				CASE "fields"."RDB$FIELD_TYPE" | ||||
| 					WHEN 7 THEN \'SMALLINT\' | ||||
| 					WHEN 8 THEN \'INTEGER\' | ||||
| 					WHEN 9 THEN \'QUAD\' | ||||
| 					WHEN 10 THEN \'FLOAT\' | ||||
| 					WHEN 11 THEN \'DFLOAT\' | ||||
| 					WHEN 12 THEN \'DATE\' | ||||
| 					WHEN 13 THEN \'TIME\' | ||||
| 					WHEN 14 THEN \'CHAR\' | ||||
| 					WHEN 16 THEN \'INT64\' | ||||
| 					WHEN 27 THEN \'DOUBLE\' | ||||
| 					WHEN 35 THEN \'TIMESTAMP\' | ||||
| 					WHEN 37 THEN \'VARCHAR\' | ||||
| 					WHEN 40 THEN \'CSTRING\' | ||||
| 					WHEN 261 THEN \'BLOB\' | ||||
| 					ELSE NULL | ||||
| 				END AS "type", | ||||
| 				"fields"."RDB$FIELD_LENGTH" AS "max_length", | ||||
| 				"rfields"."RDB$DEFAULT_VALUE" AS "default" | ||||
| 			FROM "RDB$RELATION_FIELDS" "rfields" | ||||
| 				JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" | ||||
| 			WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' | ||||
| 			ORDER BY "rfields"."RDB$FIELD_POSITION"'; | ||||
|  | ||||
| 		return (($query = $this->query($sql)) !== FALSE) | ||||
| 			? $query->result_object() | ||||
| 			: FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * | ||||
| 	 * If the database does not support the TRUNCATE statement, | ||||
| 	 * then this method maps to 'DELETE FROM table' | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _truncate($table) | ||||
| 	{ | ||||
| 		return 'DELETE FROM '.$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		// Limit clause depends on if Interbase or Firebird | ||||
| 		if (stripos($this->version(), 'firebird') !== FALSE) | ||||
| 		{ | ||||
| 			$select = 'FIRST '.$this->qb_limit | ||||
| 				.($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : ''); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$select = 'ROWS ' | ||||
| 				.($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); | ||||
| 		} | ||||
|  | ||||
| 		return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data. | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @param	array	$keys	INSERT keys | ||||
| 	 * @param	array	$values	INSERT values | ||||
| 	 * @return	string|bool | ||||
| 	 */ | ||||
| 	protected function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,237 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO Firebird Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_firebird_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * RENAME TABLE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_rename_table	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'SMALLINT'	=> 'INTEGER', | ||||
| 		'INTEGER'	=> 'INT64', | ||||
| 		'FLOAT'		=> 'DOUBLE PRECISION' | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * NULL value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_null		= 'NULL'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @param	string	$db_name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	public function create_database($db_name) | ||||
| 	{ | ||||
| 		// Firebird databases are flat files, so a path is required | ||||
|  | ||||
| 		// Hostname is needed for remote access | ||||
| 		empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; | ||||
|  | ||||
| 		return parent::create_database('"'.$db_name.'"'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @param	string	$db_name	(ignored) | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function drop_database($db_name) | ||||
| 	{ | ||||
| 		if ( ! ibase_drop_db($this->conn_id)) | ||||
| 		{ | ||||
| 			return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; | ||||
| 		} | ||||
| 		elseif ( ! empty($this->db->data_cache['db_names'])) | ||||
| 		{ | ||||
| 			$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); | ||||
| 			if ($key !== FALSE) | ||||
| 			{ | ||||
| 				unset($this->db->data_cache['db_names'][$key]); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
|  	{ | ||||
| 		if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); | ||||
| 		$sqls = array(); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if ($field[$i]['_literal'] !== FALSE) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($field[$i]['type'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' TYPE '.$field[$i]['type'].$field[$i]['length']; | ||||
| 			} | ||||
|  | ||||
| 			if ( ! empty($field[$i]['default'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' SET DEFAULT '.$field[$i]['default']; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($field[$i]['null'])) | ||||
| 			{ | ||||
| 				$sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' | ||||
| 					.($field[$i]['null'] === TRUE ? 'NULL' : '1') | ||||
| 					.' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) | ||||
| 					.' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); | ||||
| 			} | ||||
|  | ||||
| 			if ( ! empty($field[$i]['new_name'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sqls; | ||||
|  	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process column | ||||
| 	 * | ||||
| 	 * @param	array	$field | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_column($field) | ||||
| 	{ | ||||
| 		return $this->db->escape_identifiers($field['name']) | ||||
| 			.' '.$field['type'].$field['length'] | ||||
| 			.$field['null'] | ||||
| 			.$field['unique'] | ||||
| 			.$field['default']; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'SMALLINT'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'INT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				return; | ||||
| 			case 'BIGINT': | ||||
| 				$attributes['TYPE'] = 'INT64'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		// Not supported | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										244
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,244 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO IBM DB2 Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_ibm_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'ibm'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'ibm:'; | ||||
|  | ||||
| 			// Pre-defined DSN | ||||
| 			if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) | ||||
| 			{ | ||||
| 				if (isset($this->DSN)) | ||||
| 				{ | ||||
| 					$this->dsn .= 'DSN='.$this->DSN; | ||||
| 				} | ||||
| 				elseif ( ! empty($this->database)) | ||||
| 				{ | ||||
| 					$this->dsn .= 'DSN='.$this->database; | ||||
| 				} | ||||
|  | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			$this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; | ||||
|  | ||||
| 			if (isset($this->DATABASE)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'DATABASE='.$this->DATABASE.';'; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->database)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'DATABASE='.$this->database.';'; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->HOSTNAME)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->PORT)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'PORT='.$this->port.';'; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->port)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';PORT='.$this->port.';'; | ||||
| 			} | ||||
|  | ||||
| 			$this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "tabname" FROM "syscat"."tables" | ||||
| 			WHERE "type" = \'T\' AND LOWER("tabschema") = '.$this->escape(strtolower($this->database)); | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			$sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT "colname" FROM "syscat"."columns" | ||||
| 			WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' | ||||
| 				AND LOWER("tabname") = '.$this->escape(strtolower($table)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "colname" AS "name", "typename" AS "type", "default" AS "default", "length" AS "max_length", | ||||
| 				CASE "keyseq" WHEN NULL THEN 0 ELSE 1 END AS "primary_key" | ||||
| 			FROM "syscat"."columns" | ||||
| 			WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' | ||||
| 				AND LOWER("tabname") = '.$this->escape(strtolower($table)).' | ||||
| 			ORDER BY "colno"'; | ||||
|  | ||||
| 		return (($query = $this->query($sql)) !== FALSE) | ||||
| 			? $query->result_object() | ||||
| 			: FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		$this->qb_orderby = array(); | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		$sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY'; | ||||
|  | ||||
| 		return ($this->qb_offset) | ||||
| 			? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset | ||||
| 			: $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										154
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,154 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO IBM DB2 Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_ibm_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * RENAME TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_rename_table	= 'RENAME TABLE %s TO %s'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'SMALLINT'	=> 'INTEGER', | ||||
| 		'INT'		=> 'BIGINT', | ||||
| 		'INTEGER'	=> 'BIGINT' | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * DEFAULT value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_default		= FALSE; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if ($alter_type === 'CHANGE') | ||||
| 		{ | ||||
| 			$alter_type = 'MODIFY'; | ||||
| 		} | ||||
|  | ||||
| 		return parent::_alter_table($alter_type, $table, $field); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'SMALLINT'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute UNIQUE | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_unique(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) | ||||
| 		{ | ||||
| 			$field['unique'] = ' UNIQUE'; | ||||
|  | ||||
| 			// UNIQUE must be used with NOT NULL | ||||
| 			$field['null'] = ' NOT NULL'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		// Not supported | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,309 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO Informix Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_informix_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'informix'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('ASC', 'ASC'); // Currently not supported | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'informix:'; | ||||
|  | ||||
| 			// Pre-defined DSN | ||||
| 			if (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service)) | ||||
| 			{ | ||||
| 				if (isset($this->DSN)) | ||||
| 				{ | ||||
| 					$this->dsn .= 'DSN='.$this->DSN; | ||||
| 				} | ||||
| 				elseif ( ! empty($this->database)) | ||||
| 				{ | ||||
| 					$this->dsn .= 'DSN='.$this->database; | ||||
| 				} | ||||
|  | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->host)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'host='.$this->host; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->service)) | ||||
| 			{ | ||||
| 				$this->dsn .= '; service='.$this->service; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->port)) | ||||
| 			{ | ||||
| 				$this->dsn .= '; service='.$this->port; | ||||
| 			} | ||||
|  | ||||
| 			empty($this->database) OR $this->dsn .= '; database='.$this->database; | ||||
| 			empty($this->server) OR $this->dsn .= '; server='.$this->server; | ||||
|  | ||||
| 			$this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp') | ||||
| 				.'; EnableScrollableCursors=1'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "tabname" FROM "systables" | ||||
| 			WHERE "tabid" > 99 AND "tabtype" = \'T\' AND LOWER("owner") = '.$this->escape(strtolower($this->username)); | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			$sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		if (strpos($table, '.') !== FALSE) | ||||
| 		{ | ||||
| 			sscanf($table, '%[^.].%s', $owner, $table); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$owner = $this->username; | ||||
| 		} | ||||
|  | ||||
| 		return 'SELECT "colname" FROM "systables", "syscolumns" | ||||
| 			WHERE "systables"."tabid" = "syscolumns"."tabid" | ||||
| 				AND "systables"."tabtype" = \'T\' | ||||
| 				AND LOWER("systables"."owner") = '.$this->escape(strtolower($owner)).' | ||||
| 				AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "syscolumns"."colname" AS "name", | ||||
| 				CASE "syscolumns"."coltype" | ||||
| 					WHEN 0 THEN \'CHAR\' | ||||
| 					WHEN 1 THEN \'SMALLINT\' | ||||
| 					WHEN 2 THEN \'INTEGER\' | ||||
| 					WHEN 3 THEN \'FLOAT\' | ||||
| 					WHEN 4 THEN \'SMALLFLOAT\' | ||||
| 					WHEN 5 THEN \'DECIMAL\' | ||||
| 					WHEN 6 THEN \'SERIAL\' | ||||
| 					WHEN 7 THEN \'DATE\' | ||||
| 					WHEN 8 THEN \'MONEY\' | ||||
| 					WHEN 9 THEN \'NULL\' | ||||
| 					WHEN 10 THEN \'DATETIME\' | ||||
| 					WHEN 11 THEN \'BYTE\' | ||||
| 					WHEN 12 THEN \'TEXT\' | ||||
| 					WHEN 13 THEN \'VARCHAR\' | ||||
| 					WHEN 14 THEN \'INTERVAL\' | ||||
| 					WHEN 15 THEN \'NCHAR\' | ||||
| 					WHEN 16 THEN \'NVARCHAR\' | ||||
| 					WHEN 17 THEN \'INT8\' | ||||
| 					WHEN 18 THEN \'SERIAL8\' | ||||
| 					WHEN 19 THEN \'SET\' | ||||
| 					WHEN 20 THEN \'MULTISET\' | ||||
| 					WHEN 21 THEN \'LIST\' | ||||
| 					WHEN 22 THEN \'Unnamed ROW\' | ||||
| 					WHEN 40 THEN \'LVARCHAR\' | ||||
| 					WHEN 41 THEN \'BLOB/CLOB/BOOLEAN\' | ||||
| 					WHEN 4118 THEN \'Named ROW\' | ||||
| 					ELSE "syscolumns"."coltype" | ||||
| 				END AS "type", | ||||
| 				"syscolumns"."collength" as "max_length", | ||||
| 				CASE "sysdefaults"."type" | ||||
| 					WHEN \'L\' THEN "sysdefaults"."default" | ||||
| 					ELSE NULL | ||||
| 				END AS "default" | ||||
| 			FROM "syscolumns", "systables", "sysdefaults" | ||||
| 			WHERE "syscolumns"."tabid" = "systables"."tabid" | ||||
| 				AND "systables"."tabid" = "sysdefaults"."tabid" | ||||
| 				AND "syscolumns"."colno" = "sysdefaults"."colno" | ||||
| 				AND "systables"."tabtype" = \'T\' | ||||
| 				AND LOWER("systables"."owner") = '.$this->escape(strtolower($this->username)).' | ||||
| 				AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)).' | ||||
| 			ORDER BY "syscolumns"."colno"'; | ||||
|  | ||||
| 		return (($query = $this->query($sql)) !== FALSE) | ||||
| 			? $query->result_object() | ||||
| 			: FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		$this->qb_orderby = array(); | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * | ||||
| 	 * If the database does not support the TRUNCATE statement, | ||||
| 	 * then this method maps to 'DELETE FROM table' | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _truncate($table) | ||||
| 	{ | ||||
| 		return 'TRUNCATE TABLE ONLY '.$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	$SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		$select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' '; | ||||
| 		return preg_replace('/^(SELECT\s)/i', $select, $sql, 1); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,163 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO Informix Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_informix_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * RENAME TABLE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_rename_table	= 'RENAME TABLE %s TO %s'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'SMALLINT'	=> 'INTEGER', | ||||
| 		'INT'		=> 'BIGINT', | ||||
| 		'INTEGER'	=> 'BIGINT', | ||||
| 		'REAL'		=> 'DOUBLE PRECISION', | ||||
| 		'SMALLFLOAT'	=> 'DOUBLE PRECISION' | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * DEFAULT value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_default		= ', '; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if ($alter_type === 'CHANGE') | ||||
| 		{ | ||||
| 			$alter_type = 'MODIFY'; | ||||
| 		} | ||||
|  | ||||
| 		return parent::_alter_table($alter_type, $table, $field); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'SMALLINT'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'BYTE': | ||||
| 			case 'TEXT': | ||||
| 			case 'BLOB': | ||||
| 			case 'CLOB': | ||||
| 				$attributes['UNIQUE'] = FALSE; | ||||
| 				if (isset($attributes['DEFAULT'])) | ||||
| 				{ | ||||
| 					unset($attributes['DEFAULT']); | ||||
| 				} | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute UNIQUE | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_unique(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) | ||||
| 		{ | ||||
| 			$field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		// Not supported | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										374
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										374
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,374 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO MySQL Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'mysql'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Compression flag | ||||
| 	 * | ||||
| 	 * @var	bool | ||||
| 	 */ | ||||
| 	public $compress = FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * Strict ON flag | ||||
| 	 * | ||||
| 	 * Whether we're running in strict SQL mode. | ||||
| 	 * | ||||
| 	 * @var	bool | ||||
| 	 */ | ||||
| 	public $stricton; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Identifier escape character | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_escape_char = '`'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
|  | ||||
| 			empty($this->port) OR $this->dsn .= ';port='.$this->port; | ||||
| 			empty($this->database) OR $this->dsn .= ';dbname='.$this->database; | ||||
| 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 		elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) | ||||
| 		{ | ||||
| 			$this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database connection | ||||
| 	 * | ||||
| 	 * @param	bool	$persistent | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function db_connect($persistent = FALSE) | ||||
| 	{ | ||||
| 		if (isset($this->stricton)) | ||||
| 		{ | ||||
| 			if ($this->stricton) | ||||
| 			{ | ||||
| 				$sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( | ||||
|                                         @@sql_mode, | ||||
|                                         "STRICT_ALL_TABLES,", ""), | ||||
|                                         ",STRICT_ALL_TABLES", ""), | ||||
|                                         "STRICT_ALL_TABLES", ""), | ||||
|                                         "STRICT_TRANS_TABLES,", ""), | ||||
|                                         ",STRICT_TRANS_TABLES", ""), | ||||
|                                         "STRICT_TRANS_TABLES", "")'; | ||||
| 			} | ||||
|  | ||||
| 			if ( ! empty($sql)) | ||||
| 			{ | ||||
| 				if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) | ||||
| 				{ | ||||
| 					$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($this->compress === TRUE) | ||||
| 		{ | ||||
| 			$this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($this->encrypt)) | ||||
| 		{ | ||||
| 			$ssl = array(); | ||||
| 			empty($this->encrypt['ssl_key'])    OR $ssl[PDO::MYSQL_ATTR_SSL_KEY]    = $this->encrypt['ssl_key']; | ||||
| 			empty($this->encrypt['ssl_cert'])   OR $ssl[PDO::MYSQL_ATTR_SSL_CERT]   = $this->encrypt['ssl_cert']; | ||||
| 			empty($this->encrypt['ssl_ca'])     OR $ssl[PDO::MYSQL_ATTR_SSL_CA]     = $this->encrypt['ssl_ca']; | ||||
| 			empty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath']; | ||||
| 			empty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher']; | ||||
|  | ||||
| 			// DO NOT use array_merge() here! | ||||
| 			// It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers. | ||||
| 			empty($ssl) OR $this->options += $ssl; | ||||
| 		} | ||||
|  | ||||
| 		// Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails | ||||
| 		if ( | ||||
| 			($pdo = parent::db_connect($persistent)) !== FALSE | ||||
| 			&& ! empty($ssl) | ||||
| 			&& version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=') | ||||
| 			&& empty($pdo->query("SHOW STATUS LIKE 'ssl_cipher'")->fetchObject()->Value) | ||||
| 		) | ||||
| 		{ | ||||
| 			$message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; | ||||
| 			log_message('error', $message); | ||||
| 			return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return $pdo; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @param	string	$database | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function db_select($database = '') | ||||
| 	{ | ||||
| 		if ($database === '') | ||||
| 		{ | ||||
| 			$database = $this->database; | ||||
| 		} | ||||
|  | ||||
| 		if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) | ||||
| 		{ | ||||
| 			$this->database = $database; | ||||
| 			$this->data_cache = array(); | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	protected function _trans_begin() | ||||
| 	{ | ||||
| 		$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); | ||||
| 		return $this->conn_id->beginTransaction(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	protected function _trans_commit() | ||||
| 	{ | ||||
| 		if ($this->conn_id->commit()) | ||||
| 		{ | ||||
| 			$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	protected function _trans_rollback() | ||||
| 	{ | ||||
| 		if ($this->conn_id->rollBack()) | ||||
| 		{ | ||||
| 			$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SHOW TABLES'; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		$query = $query->result_object(); | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]->Field; | ||||
|  | ||||
| 			sscanf($query[$i]->Type, '%[a-z](%d)', | ||||
| 				$retval[$i]->type, | ||||
| 				$retval[$i]->max_length | ||||
| 			); | ||||
|  | ||||
| 			$retval[$i]->default		= $query[$i]->Default; | ||||
| 			$retval[$i]->primary_key	= (int) ($query[$i]->Key === 'PRI'); | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * | ||||
| 	 * If the database does not support the TRUNCATE statement, | ||||
| 	 * then this method maps to 'DELETE FROM table' | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _truncate($table) | ||||
| 	{ | ||||
| 		return 'TRUNCATE '.$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * FROM tables | ||||
| 	 * | ||||
| 	 * Groups tables in FROM clauses if needed, so there is no confusion | ||||
| 	 * about operator precedence. | ||||
| 	 * | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _from_tables() | ||||
| 	{ | ||||
| 		if ( ! empty($this->qb_join) && count($this->qb_from) > 1) | ||||
| 		{ | ||||
| 			return '('.implode(', ', $this->qb_from).')'; | ||||
| 		} | ||||
|  | ||||
| 		return implode(', ', $this->qb_from); | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										256
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,256 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO MySQL Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_mysql_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_database	= 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s'; | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_table_if	= 'CREATE TABLE IF NOT EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE keys flag | ||||
| 	 * | ||||
| 	 * Whether table keys are created from within the | ||||
| 	 * CREATE TABLE statement. | ||||
| 	 * | ||||
| 	 * @var	bool | ||||
| 	 */ | ||||
| 	protected $_create_table_keys	= TRUE; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= 'DROP TABLE IF EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'TINYINT', | ||||
| 		'SMALLINT', | ||||
| 		'MEDIUMINT', | ||||
| 		'INT', | ||||
| 		'INTEGER', | ||||
| 		'BIGINT', | ||||
| 		'REAL', | ||||
| 		'DOUBLE', | ||||
| 		'DOUBLE PRECISION', | ||||
| 		'FLOAT', | ||||
| 		'DECIMAL', | ||||
| 		'NUMERIC' | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * NULL value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_null = 'NULL'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE attributes | ||||
| 	 * | ||||
| 	 * @param	array	$attributes	Associative array of table attributes | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _create_table_attr($attributes) | ||||
| 	{ | ||||
| 		$sql = ''; | ||||
|  | ||||
| 		foreach (array_keys($attributes) as $key) | ||||
| 		{ | ||||
| 			if (is_string($key)) | ||||
| 			{ | ||||
| 				$sql .= ' '.strtoupper($key).' = '.$attributes[$key]; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ( ! empty($this->db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) | ||||
| 		{ | ||||
| 			$sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) | ||||
| 		{ | ||||
| 			$sql .= ' COLLATE = '.$this->db->dbcollat; | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if ($alter_type === 'DROP') | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if ($field[$i]['_literal'] !== FALSE) | ||||
| 			{ | ||||
| 				$field[$i] = ($alter_type === 'ADD') | ||||
| 						? "\n\tADD ".$field[$i]['_literal'] | ||||
| 						: "\n\tMODIFY ".$field[$i]['_literal']; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if ($alter_type === 'ADD') | ||||
| 				{ | ||||
| 					$field[$i]['_literal'] = "\n\tADD "; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; | ||||
| 				} | ||||
|  | ||||
| 				$field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return array($sql.implode(',', $field)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process column | ||||
| 	 * | ||||
| 	 * @param	array	$field | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_column($field) | ||||
| 	{ | ||||
| 		$extra_clause = isset($field['after']) | ||||
| 			? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; | ||||
|  | ||||
| 		if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) | ||||
| 		{ | ||||
| 			$extra_clause = ' FIRST'; | ||||
| 		} | ||||
|  | ||||
| 		return $this->db->escape_identifiers($field['name']) | ||||
| 			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) | ||||
| 			.' '.$field['type'].$field['length'] | ||||
| 			.$field['unsigned'] | ||||
| 			.$field['null'] | ||||
| 			.$field['default'] | ||||
| 			.$field['auto_increment'] | ||||
| 			.$field['unique'] | ||||
| 			.(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) | ||||
| 			.$extra_clause; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process indexes | ||||
| 	 * | ||||
| 	 * @param	string	$table	(ignored) | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_indexes($table) | ||||
| 	{ | ||||
| 		$sql = ''; | ||||
|  | ||||
| 		for ($i = 0, $c = count($this->keys); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if (is_array($this->keys[$i])) | ||||
| 			{ | ||||
| 				for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) | ||||
| 				{ | ||||
| 					if ( ! isset($this->fields[$this->keys[$i][$i2]])) | ||||
| 					{ | ||||
| 						unset($this->keys[$i][$i2]); | ||||
| 						continue; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			elseif ( ! isset($this->fields[$this->keys[$i]])) | ||||
| 			{ | ||||
| 				unset($this->keys[$i]); | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); | ||||
|  | ||||
| 			$sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) | ||||
| 				.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; | ||||
| 		} | ||||
|  | ||||
| 		$this->keys = array(); | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										326
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										326
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,326 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO Oracle Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_oci_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'oci'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List of reserved identifiers | ||||
| 	 * | ||||
| 	 * Identifiers that must NOT be escaped. | ||||
| 	 * | ||||
| 	 * @var	string[] | ||||
| 	 */ | ||||
| 	protected $_reserved_identifiers = array('*', 'rownum'); | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('ASC', 'ASC'); // Currently not supported | ||||
|  | ||||
| 	/** | ||||
| 	 * COUNT string | ||||
| 	 * | ||||
| 	 * @used-by	CI_DB_driver::count_all() | ||||
| 	 * @used-by	CI_DB_query_builder::count_all_results() | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_count_string = 'SELECT COUNT(1) AS '; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'oci:dbname='; | ||||
|  | ||||
| 			// Oracle has a slightly different PDO DSN format (Easy Connect), | ||||
| 			// which also supports pre-defined DSNs. | ||||
| 			if (empty($this->hostname) && empty($this->port)) | ||||
| 			{ | ||||
| 				$this->dsn .= $this->database; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname) | ||||
| 					.(empty($this->port) ? '' : ':'.$this->port).'/'; | ||||
|  | ||||
| 				empty($this->database) OR $this->dsn .= $this->database; | ||||
| 			} | ||||
|  | ||||
| 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 		elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE) | ||||
| 		{ | ||||
| 			$this->dsn .= ';charset='.$this->char_set; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database version number | ||||
| 	 * | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	public function version() | ||||
| 	{ | ||||
| 		if (isset($this->data_cache['version'])) | ||||
| 		{ | ||||
| 			return $this->data_cache['version']; | ||||
| 		} | ||||
|  | ||||
| 		$version_string = parent::version(); | ||||
| 		if (preg_match('#Release\s(?<version>\d+(?:\.\d+)+)#', $version_string, $match)) | ||||
| 		{ | ||||
| 			return $this->data_cache['version'] = $match[1]; | ||||
| 		} | ||||
|  | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		if (strpos($table, '.') !== FALSE) | ||||
| 		{ | ||||
| 			sscanf($table, '%[^.].%s', $owner, $table); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$owner = $this->username; | ||||
| 		} | ||||
|  | ||||
| 		return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS | ||||
| 			WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' | ||||
| 				AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		if (strpos($table, '.') !== FALSE) | ||||
| 		{ | ||||
| 			sscanf($table, '%[^.].%s', $owner, $table); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$owner = $this->username; | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE | ||||
| 			FROM ALL_TAB_COLUMNS | ||||
| 			WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' | ||||
| 				AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); | ||||
|  | ||||
| 		if (($query = $this->query($sql)) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		$query = $query->result_object(); | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]->COLUMN_NAME; | ||||
| 			$retval[$i]->type		= $query[$i]->DATA_TYPE; | ||||
|  | ||||
| 			$length = ($query[$i]->CHAR_LENGTH > 0) | ||||
| 				? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; | ||||
| 			if ($length === NULL) | ||||
| 			{ | ||||
| 				$length = $query[$i]->DATA_LENGTH; | ||||
| 			} | ||||
| 			$retval[$i]->max_length		= $length; | ||||
|  | ||||
| 			$default = $query[$i]->DATA_DEFAULT; | ||||
| 			if ($default === NULL && $query[$i]->NULLABLE === 'N') | ||||
| 			{ | ||||
| 				$default = ''; | ||||
| 			} | ||||
| 			$retval[$i]->default		= $query[$i]->COLUMN_DEFAULT; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert batch statement | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @param	array	$keys	INSERT keys | ||||
| 	 * @param	array	$values	INSERT values | ||||
| 	 * @return 	string | ||||
| 	 */ | ||||
| 	protected function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		$keys = implode(', ', $keys); | ||||
| 		$sql = "INSERT ALL\n"; | ||||
|  | ||||
| 		for ($i = 0, $c = count($values); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$sql .= '	INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; | ||||
| 		} | ||||
|  | ||||
| 		return $sql.'SELECT * FROM dual'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		if ($this->qb_limit) | ||||
| 		{ | ||||
| 			$this->where('rownum <= ',$this->qb_limit, FALSE); | ||||
| 			$this->qb_limit = FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		if (version_compare($this->version(), '12.1', '>=')) | ||||
| 		{ | ||||
| 			// OFFSET-FETCH can be used only with the ORDER BY clause | ||||
| 			empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; | ||||
|  | ||||
| 			return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; | ||||
| 		} | ||||
|  | ||||
| 		return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' | ||||
| 			.($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										176
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,176 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO Oracle Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_database	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_table_if	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP DATABASE statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_database	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	bool|array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= FALSE; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if ($alter_type === 'DROP') | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
| 		elseif ($alter_type === 'CHANGE') | ||||
| 		{ | ||||
| 			$alter_type = 'MODIFY'; | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); | ||||
| 		$sqls = array(); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if ($field[$i]['_literal'] !== FALSE) | ||||
| 			{ | ||||
| 				$field[$i] = "\n\t".$field[$i]['_literal']; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); | ||||
|  | ||||
| 				if ( ! empty($field[$i]['comment'])) | ||||
| 				{ | ||||
| 					$sqls[] = 'COMMENT ON COLUMN ' | ||||
| 						.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 						.' IS '.$field[$i]['comment']; | ||||
| 				} | ||||
|  | ||||
| 				if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) | ||||
| 				{ | ||||
| 					$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 						.' TO '.$this->db->escape_identifiers($field[$i]['new_name']); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= ' '.$alter_type.' '; | ||||
| 		$sql .= (count($field) === 1) | ||||
| 				? $field[0] | ||||
| 				: '('.implode(',', $field).')'; | ||||
|  | ||||
| 		// RENAME COLUMN must be executed after MODIFY | ||||
| 		array_unshift($sqls, $sql); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		// Not supported - sequences and triggers must be used instead | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'NUMBER'; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'NUMBER'; | ||||
| 				return; | ||||
| 			case 'INT': | ||||
| 				$attributes['TYPE'] = 'NUMBER'; | ||||
| 				return; | ||||
| 			case 'BIGINT': | ||||
| 				$attributes['TYPE'] = 'NUMBER'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										229
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,229 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO ODBC Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'odbc'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Database schema | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $schema = 'public'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Identifier escape character | ||||
| 	 * | ||||
| 	 * Must be empty for ODBC. | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_escape_char = ''; | ||||
|  | ||||
| 	/** | ||||
| 	 * ESCAPE statement string | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_like_escape_str = " {escape '%s'} "; | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('RND()', 'RND(%d)'); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'odbc:'; | ||||
|  | ||||
| 			// Pre-defined DSN | ||||
| 			if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) | ||||
| 			{ | ||||
| 				if (isset($this->DSN)) | ||||
| 				{ | ||||
| 					$this->dsn .= 'DSN='.$this->DSN; | ||||
| 				} | ||||
| 				elseif ( ! empty($this->database)) | ||||
| 				{ | ||||
| 					$this->dsn .= 'DSN='.$this->database; | ||||
| 				} | ||||
|  | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			// If the DSN is not pre-configured - try to build an IBM DB2 connection string | ||||
| 			$this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; | ||||
|  | ||||
| 			if (isset($this->DATABASE)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'DATABASE='.$this->DATABASE.';'; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->database)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'DATABASE='.$this->database.';'; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->HOSTNAME)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->PORT)) | ||||
| 			{ | ||||
| 				$this->dsn .= 'PORT='.$this->port.';'; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->port)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';PORT='.$this->port.';'; | ||||
| 			} | ||||
|  | ||||
| 			$this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Platform-dependent string escape | ||||
| 	 * | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _escape_str($str) | ||||
| 	{ | ||||
| 		$this->display_error('db_unsupported_feature'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Determines if a query is a "write" type. | ||||
| 	 * | ||||
| 	 * @param	string	An SQL query string | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function is_write_type($sql) | ||||
| 	{ | ||||
| 		if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return parent::is_write_type($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,70 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO ODBC Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_odbc_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	bool|array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= FALSE; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		// Not supported (in most databases at least) | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										384
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,384 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO PostgreSQL Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'pgsql'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Database schema | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $schema = 'public'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('RANDOM()', 'RANDOM()'); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
|  | ||||
| 			empty($this->port) OR $this->dsn .= ';port='.$this->port; | ||||
| 			empty($this->database) OR $this->dsn .= ';dbname='.$this->database; | ||||
|  | ||||
| 			if ( ! empty($this->username)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';username='.$this->username; | ||||
| 				empty($this->password) OR $this->dsn .= ';password='.$this->password; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database connection | ||||
| 	 * | ||||
| 	 * @param	bool	$persistent | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function db_connect($persistent = FALSE) | ||||
| 	{ | ||||
| 		$this->conn_id = parent::db_connect($persistent); | ||||
|  | ||||
| 		if (is_object($this->conn_id) && ! empty($this->schema)) | ||||
| 		{ | ||||
| 			$this->simple_query('SET search_path TO '.$this->schema.',public'); | ||||
| 		} | ||||
|  | ||||
| 		return $this->conn_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @param	string	$name | ||||
| 	 * @return	int | ||||
| 	 */ | ||||
| 	public function insert_id($name = NULL) | ||||
| 	{ | ||||
| 		if ($name === NULL && version_compare($this->version(), '8.1', '>=')) | ||||
| 		{ | ||||
| 			$query = $this->query('SELECT LASTVAL() AS ins_id'); | ||||
| 			$query = $query->row(); | ||||
| 			return $query->ins_id; | ||||
| 		} | ||||
|  | ||||
| 		return $this->conn_id->lastInsertId($name); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Determines if a query is a "write" type. | ||||
| 	 * | ||||
| 	 * @param	string	An SQL query string | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function is_write_type($sql) | ||||
| 	{ | ||||
| 		if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return parent::is_write_type($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Smart" Escape String | ||||
| 	 * | ||||
| 	 * Escapes data based on type | ||||
| 	 * | ||||
| 	 * @param	string	$str | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	public function escape($str) | ||||
| 	{ | ||||
| 		if (is_bool($str)) | ||||
| 		{ | ||||
| 			return ($str) ? 'TRUE' : 'FALSE'; | ||||
| 		} | ||||
|  | ||||
| 		return parent::escape($str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY | ||||
| 	 * | ||||
| 	 * @param	string	$orderby | ||||
| 	 * @param	string	$direction	ASC, DESC or RANDOM | ||||
| 	 * @param	bool	$escape | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function order_by($orderby, $direction = '', $escape = NULL) | ||||
| 	{ | ||||
| 		$direction = strtoupper(trim($direction)); | ||||
| 		if ($direction === 'RANDOM') | ||||
| 		{ | ||||
| 			if ( ! is_float($orderby) && ctype_digit((string) $orderby)) | ||||
| 			{ | ||||
| 				$orderby = ($orderby > 1) | ||||
| 					? (float) '0.'.$orderby | ||||
| 					: (float) $orderby; | ||||
| 			} | ||||
|  | ||||
| 			if (is_float($orderby)) | ||||
| 			{ | ||||
| 				$this->simple_query('SET SEED '.$orderby); | ||||
| 			} | ||||
|  | ||||
| 			$orderby = $this->_random_keyword[0]; | ||||
| 			$direction = ''; | ||||
| 			$escape = FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return parent::order_by($orderby, $direction, $escape); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql.' AND "table_name" LIKE \'' | ||||
| 				.$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT "column_name" | ||||
| 			FROM "information_schema"."columns" | ||||
| 			WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" | ||||
| 			FROM "information_schema"."columns" | ||||
| 			WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); | ||||
|  | ||||
| 		if (($query = $this->query($sql)) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		$query = $query->result_object(); | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]->column_name; | ||||
| 			$retval[$i]->type		= $query[$i]->data_type; | ||||
| 			$retval[$i]->max_length		= ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; | ||||
| 			$retval[$i]->default		= $query[$i]->column_default; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		$this->qb_orderby = array(); | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update_Batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific batch update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @param	array	$values	Update data | ||||
| 	 * @param	string	$index	WHERE key | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update_batch($table, $values, $index) | ||||
| 	{ | ||||
| 		$ids = array(); | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$ids[] = $val[$index]['value']; | ||||
|  | ||||
| 			foreach (array_keys($val) as $field) | ||||
| 			{ | ||||
| 				if ($field !== $index) | ||||
| 				{ | ||||
| 					$final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$cases = ''; | ||||
| 		foreach ($final as $k => $v) | ||||
| 		{ | ||||
| 			$cases .= $k.' = (CASE '.$val[$index]['field']."\n" | ||||
| 				.implode("\n", $v)."\n" | ||||
| 				.'ELSE '.$k.' END), '; | ||||
| 		} | ||||
|  | ||||
| 		$this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); | ||||
|  | ||||
| 		return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										210
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO PostgreSQL Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_pgsql_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= 'DROP TABLE IF EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'INT2'		=> 'INTEGER', | ||||
| 		'SMALLINT'	=> 'INTEGER', | ||||
| 		'INT'		=> 'BIGINT', | ||||
| 		'INT4'		=> 'BIGINT', | ||||
| 		'INTEGER'	=> 'BIGINT', | ||||
| 		'INT8'		=> 'NUMERIC', | ||||
| 		'BIGINT'	=> 'NUMERIC', | ||||
| 		'REAL'		=> 'DOUBLE PRECISION', | ||||
| 		'FLOAT'		=> 'DOUBLE PRECISION' | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * NULL value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_null = 'NULL'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * @param	object	&$db	Database object | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct(&$db) | ||||
| 	{ | ||||
| 		parent::__construct($db); | ||||
|  | ||||
| 		if (version_compare($this->db->version(), '9.0', '>')) | ||||
| 		{ | ||||
| 			$this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
|  	{ | ||||
| 		if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); | ||||
| 		$sqls = array(); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			if ($field[$i]['_literal'] !== FALSE) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' TYPE '.$field[$i]['type'].$field[$i]['length']; | ||||
| 			} | ||||
|  | ||||
| 			if ( ! empty($field[$i]['default'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' SET DEFAULT '.$field[$i]['default']; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($field[$i]['null'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); | ||||
| 			} | ||||
|  | ||||
| 			if ( ! empty($field[$i]['new_name'])) | ||||
| 			{ | ||||
| 				$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']); | ||||
| 			} | ||||
|  | ||||
| 			if ( ! empty($field[$i]['comment'])) | ||||
| 			{ | ||||
| 				$sqls[] = 'COMMENT ON COLUMN ' | ||||
| 					.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) | ||||
| 					.' IS '.$field[$i]['comment']; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sqls; | ||||
|  	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		// Reset field lengths for data types that don't support it | ||||
| 		if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) | ||||
| 		{ | ||||
| 			$attributes['CONSTRAINT'] = NULL; | ||||
| 		} | ||||
|  | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'TINYINT': | ||||
| 				$attributes['TYPE'] = 'SMALLINT'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 		{ | ||||
| 			$field['type'] = ($field['type'] === 'NUMERIC') | ||||
| 				? 'BIGSERIAL' | ||||
| 				: 'SERIAL'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										219
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,219 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO SQLite Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'sqlite'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('RANDOM()', 'RANDOM()'); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'sqlite:'; | ||||
|  | ||||
| 			if (empty($this->database) && empty($this->hostname)) | ||||
| 			{ | ||||
| 				$this->database = ':memory:'; | ||||
| 			} | ||||
|  | ||||
| 			$this->database = empty($this->database) ? $this->hostname : $this->database; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			return $sql.' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function list_fields($table) | ||||
| 	{ | ||||
| 		// Is there a cached result? | ||||
| 		if (isset($this->data_cache['field_names'][$table])) | ||||
| 		{ | ||||
| 			return $this->data_cache['field_names'][$table]; | ||||
| 		} | ||||
|  | ||||
| 		if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$this->data_cache['field_names'][$table] = array(); | ||||
| 		foreach ($result->result_array() as $row) | ||||
| 		{ | ||||
| 			$this->data_cache['field_names'][$table][] = $row['name']; | ||||
| 		} | ||||
|  | ||||
| 		return $this->data_cache['field_names'][$table]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$query = $query->result_array(); | ||||
| 		if (empty($query)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]['name']; | ||||
| 			$retval[$i]->type		= $query[$i]['type']; | ||||
| 			$retval[$i]->max_length		= NULL; | ||||
| 			$retval[$i]->default		= $query[$i]['dflt_value']; | ||||
| 			$retval[$i]->primary_key	= isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Replace statement | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @param	array	$keys	INSERT keys | ||||
| 	 * @param	array	$values	INSERT values | ||||
| 	 * @return 	string | ||||
| 	 */ | ||||
| 	protected function _replace($table, $keys, $values) | ||||
| 	{ | ||||
| 		return 'INSERT OR '.parent::_replace($table, $keys, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * | ||||
| 	 * If the database does not support the TRUNCATE statement, | ||||
| 	 * then this method maps to 'DELETE FROM table' | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _truncate($table) | ||||
| 	{ | ||||
| 		return 'DELETE FROM '.$table; | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										238
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,238 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO SQLite Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_sqlite_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_table_if	= 'CREATE TABLE IF NOT EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= 'DROP TABLE IF EXISTS'; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	bool|array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * NULL value representation in CREATE/ALTER TABLE statements | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_null		= 'NULL'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * @param	object	&$db	Database object | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct(&$db) | ||||
| 	{ | ||||
| 		parent::__construct($db); | ||||
|  | ||||
| 		if (version_compare($this->db->version(), '3.3', '<')) | ||||
| 		{ | ||||
| 			$this->_create_table_if = FALSE; | ||||
| 			$this->_drop_table_if   = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @param	string	$db_name	(ignored) | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function create_database($db_name) | ||||
| 	{ | ||||
| 		// In SQLite, a database is created when you connect to the database. | ||||
| 		// We'll return TRUE so that an error isn't generated | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @param	string	$db_name	(ignored) | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function drop_database($db_name) | ||||
| 	{ | ||||
| 		// In SQLite, a database is dropped when we delete a file | ||||
| 		if (file_exists($this->db->database)) | ||||
| 		{ | ||||
| 			// We need to close the pseudo-connection first | ||||
| 			$this->db->close(); | ||||
| 			if ( ! @unlink($this->db->database)) | ||||
| 			{ | ||||
| 				return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; | ||||
| 			} | ||||
| 			elseif ( ! empty($this->db->data_cache['db_names'])) | ||||
| 			{ | ||||
| 				$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); | ||||
| 				if ($key !== FALSE) | ||||
| 				{ | ||||
| 					unset($this->db->data_cache['db_names'][$key]); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') | ||||
| 		{ | ||||
| 			// drop_column(): | ||||
| 			//	BEGIN TRANSACTION; | ||||
| 			//	CREATE TEMPORARY TABLE t1_backup(a,b); | ||||
| 			//	INSERT INTO t1_backup SELECT a,b FROM t1; | ||||
| 			//	DROP TABLE t1; | ||||
| 			//	CREATE TABLE t1(a,b); | ||||
| 			//	INSERT INTO t1 SELECT a,b FROM t1_backup; | ||||
| 			//	DROP TABLE t1_backup; | ||||
| 			//	COMMIT; | ||||
|  | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return parent::_alter_table($alter_type, $table, $field); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process column | ||||
| 	 * | ||||
| 	 * @param	array	$field | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _process_column($field) | ||||
| 	{ | ||||
| 		return $this->db->escape_identifiers($field['name']) | ||||
| 			.' '.$field['type'] | ||||
| 			.$field['auto_increment'] | ||||
| 			.$field['null'] | ||||
| 			.$field['unique'] | ||||
| 			.$field['default']; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'ENUM': | ||||
| 			case 'SET': | ||||
| 				$attributes['TYPE'] = 'TEXT'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) | ||||
| 		{ | ||||
| 			$field['type'] = 'INTEGER PRIMARY KEY'; | ||||
| 			$field['default'] = ''; | ||||
| 			$field['null'] = ''; | ||||
| 			$field['unique'] = ''; | ||||
| 			$field['auto_increment'] = ' AUTOINCREMENT'; | ||||
|  | ||||
| 			$this->primary_keys = array(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										369
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										369
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,369 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO SQLSRV Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the query builder | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_sqlsrv_driver extends CI_DB_pdo_driver { | ||||
|  | ||||
| 	/** | ||||
| 	 * Sub-driver | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	public $subdriver = 'sqlsrv'; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ORDER BY random keyword | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_random_keyword = array('NEWID()', 'RAND(%d)'); | ||||
|  | ||||
| 	/** | ||||
| 	 * Quoted identifier flag | ||||
| 	 * | ||||
| 	 * Whether to use SQL-92 standard quoted identifier | ||||
| 	 * (double quotes) or brackets for identifier escaping. | ||||
| 	 * | ||||
| 	 * @var	bool | ||||
| 	 */ | ||||
| 	protected $_quoted_identifier; | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Class constructor | ||||
| 	 * | ||||
| 	 * Builds the DSN if not already set. | ||||
| 	 * | ||||
| 	 * @param	array	$params | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		if (empty($this->dsn)) | ||||
| 		{ | ||||
| 			$this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); | ||||
|  | ||||
| 			empty($this->port) OR $this->dsn .= ','.$this->port; | ||||
| 			empty($this->database) OR $this->dsn .= ';Database='.$this->database; | ||||
|  | ||||
| 			// Some custom options | ||||
|  | ||||
| 			if (isset($this->QuotedId)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';QuotedId='.$this->QuotedId; | ||||
| 				$this->_quoted_identifier = (bool) $this->QuotedId; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->ConnectionPooling)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling; | ||||
| 			} | ||||
|  | ||||
| 			if ($this->encrypt === TRUE) | ||||
| 			{ | ||||
| 				$this->dsn .= ';Encrypt=1'; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->TraceOn)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';TraceOn='.$this->TraceOn; | ||||
| 			} | ||||
|  | ||||
| 			if (isset($this->TrustServerCertificate)) | ||||
| 			{ | ||||
| 				$this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate; | ||||
| 			} | ||||
|  | ||||
| 			empty($this->APP) OR $this->dsn .= ';APP='.$this->APP; | ||||
| 			empty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner; | ||||
| 			empty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout; | ||||
| 			empty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets; | ||||
| 			empty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile; | ||||
| 			empty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID; | ||||
| 		} | ||||
| 		elseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match)) | ||||
| 		{ | ||||
| 			$this->_quoted_identifier = (bool) $match[1]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database connection | ||||
| 	 * | ||||
| 	 * @param	bool	$persistent | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function db_connect($persistent = FALSE) | ||||
| 	{ | ||||
| 		if ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set)) | ||||
| 		{ | ||||
| 			$this->options[PDO::SQLSRV_ENCODING_UTF8] = 1; | ||||
| 		} | ||||
|  | ||||
| 		$this->conn_id = parent::db_connect($persistent); | ||||
|  | ||||
| 		if ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier)) | ||||
| 		{ | ||||
| 			return $this->conn_id; | ||||
| 		} | ||||
|  | ||||
| 		// Determine how identifiers are escaped | ||||
| 		$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); | ||||
| 		$query = $query->row_array(); | ||||
| 		$this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; | ||||
| 		$this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); | ||||
|  | ||||
| 		return $this->conn_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @param	bool	$prefix_limit | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = 'SELECT '.$this->escape_identifiers('name') | ||||
| 			.' FROM '.$this->escape_identifiers('sysobjects') | ||||
| 			.' WHERE '.$this->escape_identifiers('type')." = 'U'"; | ||||
|  | ||||
| 		if ($prefix_limit === TRUE && $this->dbprefix !== '') | ||||
| 		{ | ||||
| 			$sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " | ||||
| 				.sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 		} | ||||
|  | ||||
| 		return $sql.' ORDER BY '.$this->escape_identifiers('name'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return 'SELECT COLUMN_NAME | ||||
| 			FROM INFORMATION_SCHEMA.Columns | ||||
| 			WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns an object with field data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function field_data($table) | ||||
| 	{ | ||||
| 		$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT | ||||
| 			FROM INFORMATION_SCHEMA.Columns | ||||
| 			WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); | ||||
|  | ||||
| 		if (($query = $this->query($sql)) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		$query = $query->result_object(); | ||||
|  | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0, $c = count($query); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$retval[$i]			= new stdClass(); | ||||
| 			$retval[$i]->name		= $query[$i]->COLUMN_NAME; | ||||
| 			$retval[$i]->type		= $query[$i]->DATA_TYPE; | ||||
| 			$retval[$i]->max_length		= ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; | ||||
| 			$retval[$i]->default		= $query[$i]->COLUMN_DEFAULT; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @param	array	$values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values) | ||||
| 	{ | ||||
| 		$this->qb_limit = FALSE; | ||||
| 		$this->qb_orderby = array(); | ||||
| 		return parent::_update($table, $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @param	string	$table | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table) | ||||
| 	{ | ||||
| 		if ($this->qb_limit) | ||||
| 		{ | ||||
| 			return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; | ||||
| 		} | ||||
|  | ||||
| 		return parent::_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * LIMIT | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @param	string	$sql	SQL Query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _limit($sql) | ||||
| 	{ | ||||
| 		// As of SQL Server 2012 (11.0.*) OFFSET is supported | ||||
| 		if (version_compare($this->version(), '11', '>=')) | ||||
| 		{ | ||||
| 			// SQL Server OFFSET-FETCH can be used only with the ORDER BY clause | ||||
| 			empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; | ||||
|  | ||||
| 			return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; | ||||
| 		} | ||||
|  | ||||
| 		$limit = $this->qb_offset + $this->qb_limit; | ||||
|  | ||||
| 		// An ORDER BY clause is required for ROW_NUMBER() to work | ||||
| 		if ($this->qb_offset && ! empty($this->qb_orderby)) | ||||
| 		{ | ||||
| 			$orderby = $this->_compile_order_by(); | ||||
|  | ||||
| 			// We have to strip the ORDER BY clause | ||||
| 			$sql = trim(substr($sql, 0, strrpos($sql, $orderby))); | ||||
|  | ||||
| 			// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results | ||||
| 			if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) | ||||
| 			{ | ||||
| 				$select = '*'; // Inevitable | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				// Use only field names and their aliases, everything else is out of our scope. | ||||
| 				$select = array(); | ||||
| 				$field_regexp = ($this->_quoted_identifier) | ||||
| 					? '("[^\"]+")' : '(\[[^\]]+\])'; | ||||
| 				for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) | ||||
| 				{ | ||||
| 					$select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) | ||||
| 						? $m[1] : $this->qb_select[$i]; | ||||
| 				} | ||||
| 				$select = implode(', ', $select); | ||||
| 			} | ||||
|  | ||||
| 			return 'SELECT '.$select." FROM (\n\n" | ||||
| 				.preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) | ||||
| 				."\n\n) ".$this->escape_identifiers('CI_subquery') | ||||
| 				."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; | ||||
| 		} | ||||
|  | ||||
| 		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data. | ||||
| 	 * | ||||
| 	 * @param	string	$table	Table name | ||||
| 	 * @param	array	$keys	INSERT keys | ||||
| 	 * @param	array	$values	INSERT values | ||||
| 	 * @return	string|bool | ||||
| 	 */ | ||||
| 	protected function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		// Multiple-value inserts are only supported as of SQL Server 2008 | ||||
| 		if (version_compare($this->version(), '10', '>=')) | ||||
| 		{ | ||||
| 			return parent::_insert_batch($table, $keys, $values); | ||||
| 		} | ||||
|  | ||||
| 		return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; | ||||
| 	} | ||||
|  | ||||
| } | ||||
							
								
								
									
										149
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								php/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP | ||||
|  * | ||||
|  * This content is released under the MIT License (MIT) | ||||
|  * | ||||
|  * Copyright (c) 2014 - 2018, British Columbia Institute of Technology | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  * | ||||
|  * @package	CodeIgniter | ||||
|  * @author	EllisLab Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) | ||||
|  * @copyright	Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/) | ||||
|  * @license	http://opensource.org/licenses/MIT	MIT License | ||||
|  * @link	https://codeigniter.com | ||||
|  * @since	Version 3.0.0 | ||||
|  * @filesource | ||||
|  */ | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| /** | ||||
|  * PDO SQLSRV Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		https://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_sqlsrv_forge extends CI_DB_pdo_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * CREATE TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_create_table_if	= "IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\nCREATE TABLE"; | ||||
|  | ||||
| 	/** | ||||
| 	 * DROP TABLE IF statement | ||||
| 	 * | ||||
| 	 * @var	string | ||||
| 	 */ | ||||
| 	protected $_drop_table_if	= "IF EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\nDROP TABLE"; | ||||
|  | ||||
| 	/** | ||||
| 	 * UNSIGNED support | ||||
| 	 * | ||||
| 	 * @var	array | ||||
| 	 */ | ||||
| 	protected $_unsigned		= array( | ||||
| 		'TINYINT'	=> 'SMALLINT', | ||||
| 		'SMALLINT'	=> 'INT', | ||||
| 		'INT'		=> 'BIGINT', | ||||
| 		'REAL'		=> 'FLOAT' | ||||
| 	); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ALTER TABLE | ||||
| 	 * | ||||
| 	 * @param	string	$alter_type	ALTER type | ||||
| 	 * @param	string	$table		Table name | ||||
| 	 * @param	mixed	$field		Column definition | ||||
| 	 * @return	string|string[] | ||||
| 	 */ | ||||
| 	protected function _alter_table($alter_type, $table, $field) | ||||
| 	{ | ||||
| 		if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) | ||||
| 		{ | ||||
| 			return parent::_alter_table($alter_type, $table, $field); | ||||
| 		} | ||||
|  | ||||
| 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; | ||||
| 		$sqls = array(); | ||||
| 		for ($i = 0, $c = count($field); $i < $c; $i++) | ||||
| 		{ | ||||
| 			$sqls[] = $sql.$this->_process_column($field[$i]); | ||||
| 		} | ||||
|  | ||||
| 		return $sqls; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute TYPE | ||||
| 	 * | ||||
| 	 * Performs a data type mapping between different databases. | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_type(&$attributes) | ||||
| 	{ | ||||
| 		if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) | ||||
| 		{ | ||||
| 			unset($attributes['CONSTRAINT']); | ||||
| 		} | ||||
|  | ||||
| 		switch (strtoupper($attributes['TYPE'])) | ||||
| 		{ | ||||
| 			case 'MEDIUMINT': | ||||
| 				$attributes['TYPE'] = 'INTEGER'; | ||||
| 				$attributes['UNSIGNED'] = FALSE; | ||||
| 				return; | ||||
| 			case 'INTEGER': | ||||
| 				$attributes['TYPE'] = 'INT'; | ||||
| 				return; | ||||
| 			default: return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field attribute AUTO_INCREMENT | ||||
| 	 * | ||||
| 	 * @param	array	&$attributes | ||||
| 	 * @param	array	&$field | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	protected function _attr_auto_increment(&$attributes, &$field) | ||||
| 	{ | ||||
| 		if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) | ||||
| 		{ | ||||
| 			$field['auto_increment'] = ' IDENTITY(1,1)'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user