You've already forked codeigniter_test
							
							first commit
This commit is contained in:
		
							
								
								
									
										1
									
								
								system/.htaccess
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								system/.htaccess
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| Deny from all | ||||
							
								
								
									
										118
									
								
								system/core/Benchmark.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								system/core/Benchmark.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,118 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Benchmark Class | ||||
|  * | ||||
|  * This class enables you to mark points and calculate the time difference | ||||
|  * between them.  Memory consumption can also be displayed. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Libraries | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/benchmark.html | ||||
|  */ | ||||
| class CI_Benchmark { | ||||
|  | ||||
| 	/** | ||||
| 	 * List of all benchmark markers and when they were added | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $marker = array(); | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set a benchmark marker | ||||
| 	 * | ||||
| 	 * Multiple calls to this function can be made so that several | ||||
| 	 * execution points can be timed | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	$name	name of the marker | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function mark($name) | ||||
| 	{ | ||||
| 		$this->marker[$name] = microtime(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Calculates the time difference between two marked points. | ||||
| 	 * | ||||
| 	 * If the first parameter is empty this function instead returns the | ||||
| 	 * {elapsed_time} pseudo-variable. This permits the full system | ||||
| 	 * execution time to be shown in a template. The output class will | ||||
| 	 * swap the real value for this variable. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	a particular marked point | ||||
| 	 * @param	string	a particular marked point | ||||
| 	 * @param	integer	the number of decimal places | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function elapsed_time($point1 = '', $point2 = '', $decimals = 4) | ||||
| 	{ | ||||
| 		if ($point1 == '') | ||||
| 		{ | ||||
| 			return '{elapsed_time}'; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! isset($this->marker[$point1])) | ||||
| 		{ | ||||
| 			return ''; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! isset($this->marker[$point2])) | ||||
| 		{ | ||||
| 			$this->marker[$point2] = microtime(); | ||||
| 		} | ||||
|  | ||||
| 		list($sm, $ss) = explode(' ', $this->marker[$point1]); | ||||
| 		list($em, $es) = explode(' ', $this->marker[$point2]); | ||||
|  | ||||
| 		return number_format(($em + $es) - ($sm + $ss), $decimals); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Memory Usage | ||||
| 	 * | ||||
| 	 * This function returns the {memory_usage} pseudo-variable. | ||||
| 	 * This permits it to be put it anywhere in a template | ||||
| 	 * without the memory being calculated until the end. | ||||
| 	 * The output class will swap the real value for this variable. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function memory_usage() | ||||
| 	{ | ||||
| 		return '{memory_usage}'; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| // END CI_Benchmark class | ||||
|  | ||||
| /* End of file Benchmark.php */ | ||||
| /* Location: ./system/core/Benchmark.php */ | ||||
							
								
								
									
										402
									
								
								system/core/CodeIgniter.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										402
									
								
								system/core/CodeIgniter.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,402 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * System Initialization File | ||||
|  * | ||||
|  * Loads the base classes and executes the request. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	codeigniter | ||||
|  * @category	Front-controller | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Version | ||||
|  * | ||||
|  * @var string | ||||
|  * | ||||
|  */ | ||||
| 	define('CI_VERSION', '2.1.3'); | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Branch (Core = TRUE, Reactor = FALSE) | ||||
|  * | ||||
|  * @var boolean | ||||
|  * | ||||
|  */ | ||||
| 	define('CI_CORE', FALSE); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Load the global functions | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	require(BASEPATH.'core/Common.php'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Load the framework constants | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php')) | ||||
| 	{ | ||||
| 		require(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		require(APPPATH.'config/constants.php'); | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Define a custom error handler so we can log PHP errors | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	set_error_handler('_exception_handler'); | ||||
|  | ||||
| 	if ( ! is_php('5.3')) | ||||
| 	{ | ||||
| 		@set_magic_quotes_runtime(0); // Kill magic quotes | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Set the subclass_prefix | ||||
|  * ------------------------------------------------------ | ||||
|  * | ||||
|  * Normally the "subclass_prefix" is set in the config file. | ||||
|  * The subclass prefix allows CI to know if a core class is | ||||
|  * being extended via a library in the local application | ||||
|  * "libraries" folder. Since CI allows config items to be | ||||
|  * overriden via data set in the main index. php file, | ||||
|  * before proceeding we need to know if a subclass_prefix | ||||
|  * override exists.  If so, we will set this value now, | ||||
|  * before any classes are loaded | ||||
|  * Note: Since the config file data is cached it doesn't | ||||
|  * hurt to load it here. | ||||
|  */ | ||||
| 	if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '') | ||||
| 	{ | ||||
| 		get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Set a liberal script execution time limit | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0) | ||||
| 	{ | ||||
| 		@set_time_limit(300); | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Start the timer... tick tock tick tock... | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$BM =& load_class('Benchmark', 'core'); | ||||
| 	$BM->mark('total_execution_time_start'); | ||||
| 	$BM->mark('loading_time:_base_classes_start'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the hooks class | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$EXT =& load_class('Hooks', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Is there a "pre_system" hook? | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$EXT->_call_hook('pre_system'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the config class | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$CFG =& load_class('Config', 'core'); | ||||
|  | ||||
| 	// Do we have any manually set config items in the index.php file? | ||||
| 	if (isset($assign_to_config)) | ||||
| 	{ | ||||
| 		$CFG->_assign_to_config($assign_to_config); | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the UTF-8 class | ||||
|  * ------------------------------------------------------ | ||||
|  * | ||||
|  * Note: Order here is rather important as the UTF-8 | ||||
|  * class needs to be used very early on, but it cannot | ||||
|  * properly determine if UTf-8 can be supported until | ||||
|  * after the Config class is instantiated. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| 	$UNI =& load_class('Utf8', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the URI class | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$URI =& load_class('URI', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the routing class and set the routing | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$RTR =& load_class('Router', 'core'); | ||||
| 	$RTR->_set_routing(); | ||||
|  | ||||
| 	// Set any routing overrides that may exist in the main index file | ||||
| 	if (isset($routing)) | ||||
| 	{ | ||||
| 		$RTR->_set_overrides($routing); | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the output class | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$OUT =& load_class('Output', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *	Is there a valid cache file?  If so, we're done... | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	if ($EXT->_call_hook('cache_override') === FALSE) | ||||
| 	{ | ||||
| 		if ($OUT->_display_cache($CFG, $URI) == TRUE) | ||||
| 		{ | ||||
| 			exit; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ----------------------------------------------------- | ||||
|  * Load the security class for xss and csrf support | ||||
|  * ----------------------------------------------------- | ||||
|  */ | ||||
| 	$SEC =& load_class('Security', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Load the Input class and sanitize globals | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$IN	=& load_class('Input', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Load the Language class | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$LANG =& load_class('Lang', 'core'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Load the app controller and local controller | ||||
|  * ------------------------------------------------------ | ||||
|  * | ||||
|  */ | ||||
| 	// Load the base controller class | ||||
| 	require BASEPATH.'core/Controller.php'; | ||||
|  | ||||
| 	function &get_instance() | ||||
| 	{ | ||||
| 		return CI_Controller::get_instance(); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) | ||||
| 	{ | ||||
| 		require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; | ||||
| 	} | ||||
|  | ||||
| 	// Load the local application controller | ||||
| 	// Note: The Router class automatically validates the controller path using the router->_validate_request(). | ||||
| 	// If this include fails it means that the default controller in the Routes.php file is not resolving to something valid. | ||||
| 	if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php')) | ||||
| 	{ | ||||
| 		show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.'); | ||||
| 	} | ||||
|  | ||||
| 	include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'); | ||||
|  | ||||
| 	// Set a mark point for benchmarking | ||||
| 	$BM->mark('loading_time:_base_classes_end'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Security check | ||||
|  * ------------------------------------------------------ | ||||
|  * | ||||
|  *  None of the functions in the app controller or the | ||||
|  *  loader class can be called via the URI, nor can | ||||
|  *  controller functions that begin with an underscore | ||||
|  */ | ||||
| 	$class  = $RTR->fetch_class(); | ||||
| 	$method = $RTR->fetch_method(); | ||||
|  | ||||
| 	if ( ! class_exists($class) | ||||
| 		OR strncmp($method, '_', 1) == 0 | ||||
| 		OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller'))) | ||||
| 		) | ||||
| 	{ | ||||
| 		if ( ! empty($RTR->routes['404_override'])) | ||||
| 		{ | ||||
| 			$x = explode('/', $RTR->routes['404_override']); | ||||
| 			$class = $x[0]; | ||||
| 			$method = (isset($x[1]) ? $x[1] : 'index'); | ||||
| 			if ( ! class_exists($class)) | ||||
| 			{ | ||||
| 				if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) | ||||
| 				{ | ||||
| 					show_404("{$class}/{$method}"); | ||||
| 				} | ||||
|  | ||||
| 				include_once(APPPATH.'controllers/'.$class.'.php'); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			show_404("{$class}/{$method}"); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Is there a "pre_controller" hook? | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$EXT->_call_hook('pre_controller'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Instantiate the requested controller | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	// Mark a start point so we can benchmark the controller | ||||
| 	$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); | ||||
|  | ||||
| 	$CI = new $class(); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Is there a "post_controller_constructor" hook? | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$EXT->_call_hook('post_controller_constructor'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Call the requested method | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	// Is there a "remap" function? If so, we call it instead | ||||
| 	if (method_exists($CI, '_remap')) | ||||
| 	{ | ||||
| 		$CI->_remap($method, array_slice($URI->rsegments, 2)); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// is_callable() returns TRUE on some versions of PHP 5 for private and protected | ||||
| 		// methods, so we'll use this workaround for consistent behavior | ||||
| 		if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI)))) | ||||
| 		{ | ||||
| 			// Check and see if we are using a 404 override and use it. | ||||
| 			if ( ! empty($RTR->routes['404_override'])) | ||||
| 			{ | ||||
| 				$x = explode('/', $RTR->routes['404_override']); | ||||
| 				$class = $x[0]; | ||||
| 				$method = (isset($x[1]) ? $x[1] : 'index'); | ||||
| 				if ( ! class_exists($class)) | ||||
| 				{ | ||||
| 					if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) | ||||
| 					{ | ||||
| 						show_404("{$class}/{$method}"); | ||||
| 					} | ||||
|  | ||||
| 					include_once(APPPATH.'controllers/'.$class.'.php'); | ||||
| 					unset($CI); | ||||
| 					$CI = new $class(); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				show_404("{$class}/{$method}"); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Call the requested method. | ||||
| 		// Any URI segments present (besides the class/function) will be passed to the method for convenience | ||||
| 		call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2)); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// Mark a benchmark end point | ||||
| 	$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Is there a "post_controller" hook? | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$EXT->_call_hook('post_controller'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Send the final rendered output to the browser | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	if ($EXT->_call_hook('display_override') === FALSE) | ||||
| 	{ | ||||
| 		$OUT->_display(); | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Is there a "post_system" hook? | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	$EXT->_call_hook('post_system'); | ||||
|  | ||||
| /* | ||||
|  * ------------------------------------------------------ | ||||
|  *  Close the DB connection if one exists | ||||
|  * ------------------------------------------------------ | ||||
|  */ | ||||
| 	if (class_exists('CI_DB') AND isset($CI->db)) | ||||
| 	{ | ||||
| 		$CI->db->close(); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| /* End of file CodeIgniter.php */ | ||||
| /* Location: ./system/core/CodeIgniter.php */ | ||||
							
								
								
									
										564
									
								
								system/core/Common.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										564
									
								
								system/core/Common.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,564 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Common Functions | ||||
|  * | ||||
|  * Loads the base classes and executes the request. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	codeigniter | ||||
|  * @category	Common Functions | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/ | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Determines if the current version of PHP is greater then the supplied value | ||||
| * | ||||
| * Since there are a few places where we conditionally test for PHP > 5 | ||||
| * we'll set a static variable. | ||||
| * | ||||
| * @access	public | ||||
| * @param	string | ||||
| * @return	bool	TRUE if the current version is $version or higher | ||||
| */ | ||||
| if ( ! function_exists('is_php')) | ||||
| { | ||||
| 	function is_php($version = '5.0.0') | ||||
| 	{ | ||||
| 		static $_is_php; | ||||
| 		$version = (string)$version; | ||||
|  | ||||
| 		if ( ! isset($_is_php[$version])) | ||||
| 		{ | ||||
| 			$_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return $_is_php[$version]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Tests for file writability | ||||
|  * | ||||
|  * is_writable() returns TRUE on Windows servers when you really can't write to | ||||
|  * the file, based on the read-only attribute.  is_writable() is also unreliable | ||||
|  * on Unix servers if safe_mode is on. | ||||
|  * | ||||
|  * @access	private | ||||
|  * @return	void | ||||
|  */ | ||||
| if ( ! function_exists('is_really_writable')) | ||||
| { | ||||
| 	function is_really_writable($file) | ||||
| 	{ | ||||
| 		// If we're on a Unix server with safe_mode off we call is_writable | ||||
| 		if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) | ||||
| 		{ | ||||
| 			return is_writable($file); | ||||
| 		} | ||||
|  | ||||
| 		// For windows servers and safe_mode "on" installations we'll actually | ||||
| 		// write a file then read it.  Bah... | ||||
| 		if (is_dir($file)) | ||||
| 		{ | ||||
| 			$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); | ||||
|  | ||||
| 			if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			fclose($fp); | ||||
| 			@chmod($file, DIR_WRITE_MODE); | ||||
| 			@unlink($file); | ||||
| 			return TRUE; | ||||
| 		} | ||||
| 		elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		fclose($fp); | ||||
| 		return TRUE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Class registry | ||||
| * | ||||
| * This function acts as a singleton.  If the requested class does not | ||||
| * exist it is instantiated and set to a static variable.  If it has | ||||
| * previously been instantiated the variable is returned. | ||||
| * | ||||
| * @access	public | ||||
| * @param	string	the class name being requested | ||||
| * @param	string	the directory where the class should be found | ||||
| * @param	string	the class name prefix | ||||
| * @return	object | ||||
| */ | ||||
| if ( ! function_exists('load_class')) | ||||
| { | ||||
| 	function &load_class($class, $directory = 'libraries', $prefix = 'CI_') | ||||
| 	{ | ||||
| 		static $_classes = array(); | ||||
|  | ||||
| 		// Does the class exist?  If so, we're done... | ||||
| 		if (isset($_classes[$class])) | ||||
| 		{ | ||||
| 			return $_classes[$class]; | ||||
| 		} | ||||
|  | ||||
| 		$name = FALSE; | ||||
|  | ||||
| 		// Look for the class first in the local application/libraries folder | ||||
| 		// then in the native system/libraries folder | ||||
| 		foreach (array(APPPATH, BASEPATH) as $path) | ||||
| 		{ | ||||
| 			if (file_exists($path.$directory.'/'.$class.'.php')) | ||||
| 			{ | ||||
| 				$name = $prefix.$class; | ||||
|  | ||||
| 				if (class_exists($name) === FALSE) | ||||
| 				{ | ||||
| 					require($path.$directory.'/'.$class.'.php'); | ||||
| 				} | ||||
|  | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Is the request a class extension?  If so we load it too | ||||
| 		if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) | ||||
| 		{ | ||||
| 			$name = config_item('subclass_prefix').$class; | ||||
|  | ||||
| 			if (class_exists($name) === FALSE) | ||||
| 			{ | ||||
| 				require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Did we find the class? | ||||
| 		if ($name === FALSE) | ||||
| 		{ | ||||
| 			// Note: We use exit() rather then show_error() in order to avoid a | ||||
| 			// self-referencing loop with the Excptions class | ||||
| 			exit('Unable to locate the specified class: '.$class.'.php'); | ||||
| 		} | ||||
|  | ||||
| 		// Keep track of what we just loaded | ||||
| 		is_loaded($class); | ||||
|  | ||||
| 		$_classes[$class] = new $name(); | ||||
| 		return $_classes[$class]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
| * Keeps track of which libraries have been loaded.  This function is | ||||
| * called by the load_class() function above | ||||
| * | ||||
| * @access	public | ||||
| * @return	array | ||||
| */ | ||||
| if ( ! function_exists('is_loaded')) | ||||
| { | ||||
| 	function &is_loaded($class = '') | ||||
| 	{ | ||||
| 		static $_is_loaded = array(); | ||||
|  | ||||
| 		if ($class != '') | ||||
| 		{ | ||||
| 			$_is_loaded[strtolower($class)] = $class; | ||||
| 		} | ||||
|  | ||||
| 		return $_is_loaded; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Loads the main config.php file | ||||
| * | ||||
| * This function lets us grab the config file even if the Config class | ||||
| * hasn't been instantiated yet | ||||
| * | ||||
| * @access	private | ||||
| * @return	array | ||||
| */ | ||||
| if ( ! function_exists('get_config')) | ||||
| { | ||||
| 	function &get_config($replace = array()) | ||||
| 	{ | ||||
| 		static $_config; | ||||
|  | ||||
| 		if (isset($_config)) | ||||
| 		{ | ||||
| 			return $_config[0]; | ||||
| 		} | ||||
|  | ||||
| 		// Is the config file in the environment folder? | ||||
| 		if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) | ||||
| 		{ | ||||
| 			$file_path = APPPATH.'config/config.php'; | ||||
| 		} | ||||
|  | ||||
| 		// Fetch the config file | ||||
| 		if ( ! file_exists($file_path)) | ||||
| 		{ | ||||
| 			exit('The configuration file does not exist.'); | ||||
| 		} | ||||
|  | ||||
| 		require($file_path); | ||||
|  | ||||
| 		// Does the $config array exist in the file? | ||||
| 		if ( ! isset($config) OR ! is_array($config)) | ||||
| 		{ | ||||
| 			exit('Your config file does not appear to be formatted correctly.'); | ||||
| 		} | ||||
|  | ||||
| 		// Are any values being dynamically replaced? | ||||
| 		if (count($replace) > 0) | ||||
| 		{ | ||||
| 			foreach ($replace as $key => $val) | ||||
| 			{ | ||||
| 				if (isset($config[$key])) | ||||
| 				{ | ||||
| 					$config[$key] = $val; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $_config[0] =& $config; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Returns the specified config item | ||||
| * | ||||
| * @access	public | ||||
| * @return	mixed | ||||
| */ | ||||
| if ( ! function_exists('config_item')) | ||||
| { | ||||
| 	function config_item($item) | ||||
| 	{ | ||||
| 		static $_config_item = array(); | ||||
|  | ||||
| 		if ( ! isset($_config_item[$item])) | ||||
| 		{ | ||||
| 			$config =& get_config(); | ||||
|  | ||||
| 			if ( ! isset($config[$item])) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 			$_config_item[$item] = $config[$item]; | ||||
| 		} | ||||
|  | ||||
| 		return $_config_item[$item]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Error Handler | ||||
| * | ||||
| * This function lets us invoke the exception class and | ||||
| * display errors using the standard error template located | ||||
| * in application/errors/errors.php | ||||
| * This function will send the error page directly to the | ||||
| * browser and exit. | ||||
| * | ||||
| * @access	public | ||||
| * @return	void | ||||
| */ | ||||
| if ( ! function_exists('show_error')) | ||||
| { | ||||
| 	function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') | ||||
| 	{ | ||||
| 		$_error =& load_class('Exceptions', 'core'); | ||||
| 		echo $_error->show_error($heading, $message, 'error_general', $status_code); | ||||
| 		exit; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * 404 Page Handler | ||||
| * | ||||
| * This function is similar to the show_error() function above | ||||
| * However, instead of the standard error template it displays | ||||
| * 404 errors. | ||||
| * | ||||
| * @access	public | ||||
| * @return	void | ||||
| */ | ||||
| if ( ! function_exists('show_404')) | ||||
| { | ||||
| 	function show_404($page = '', $log_error = TRUE) | ||||
| 	{ | ||||
| 		$_error =& load_class('Exceptions', 'core'); | ||||
| 		$_error->show_404($page, $log_error); | ||||
| 		exit; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Error Logging Interface | ||||
| * | ||||
| * We use this as a simple mechanism to access the logging | ||||
| * class and send messages to be logged. | ||||
| * | ||||
| * @access	public | ||||
| * @return	void | ||||
| */ | ||||
| if ( ! function_exists('log_message')) | ||||
| { | ||||
| 	function log_message($level = 'error', $message, $php_error = FALSE) | ||||
| 	{ | ||||
| 		static $_log; | ||||
|  | ||||
| 		if (config_item('log_threshold') == 0) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$_log =& load_class('Log'); | ||||
| 		$_log->write_log($level, $message, $php_error); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Set HTTP Status Header | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	int		the status code | ||||
|  * @param	string | ||||
|  * @return	void | ||||
|  */ | ||||
| if ( ! function_exists('set_status_header')) | ||||
| { | ||||
| 	function set_status_header($code = 200, $text = '') | ||||
| 	{ | ||||
| 		$stati = array( | ||||
| 							200	=> 'OK', | ||||
| 							201	=> 'Created', | ||||
| 							202	=> 'Accepted', | ||||
| 							203	=> 'Non-Authoritative Information', | ||||
| 							204	=> 'No Content', | ||||
| 							205	=> 'Reset Content', | ||||
| 							206	=> 'Partial Content', | ||||
|  | ||||
| 							300	=> 'Multiple Choices', | ||||
| 							301	=> 'Moved Permanently', | ||||
| 							302	=> 'Found', | ||||
| 							304	=> 'Not Modified', | ||||
| 							305	=> 'Use Proxy', | ||||
| 							307	=> 'Temporary Redirect', | ||||
|  | ||||
| 							400	=> 'Bad Request', | ||||
| 							401	=> 'Unauthorized', | ||||
| 							403	=> 'Forbidden', | ||||
| 							404	=> 'Not Found', | ||||
| 							405	=> 'Method Not Allowed', | ||||
| 							406	=> 'Not Acceptable', | ||||
| 							407	=> 'Proxy Authentication Required', | ||||
| 							408	=> 'Request Timeout', | ||||
| 							409	=> 'Conflict', | ||||
| 							410	=> 'Gone', | ||||
| 							411	=> 'Length Required', | ||||
| 							412	=> 'Precondition Failed', | ||||
| 							413	=> 'Request Entity Too Large', | ||||
| 							414	=> 'Request-URI Too Long', | ||||
| 							415	=> 'Unsupported Media Type', | ||||
| 							416	=> 'Requested Range Not Satisfiable', | ||||
| 							417	=> 'Expectation Failed', | ||||
|  | ||||
| 							500	=> 'Internal Server Error', | ||||
| 							501	=> 'Not Implemented', | ||||
| 							502	=> 'Bad Gateway', | ||||
| 							503	=> 'Service Unavailable', | ||||
| 							504	=> 'Gateway Timeout', | ||||
| 							505	=> 'HTTP Version Not Supported' | ||||
| 						); | ||||
|  | ||||
| 		if ($code == '' OR ! is_numeric($code)) | ||||
| 		{ | ||||
| 			show_error('Status codes must be numeric', 500); | ||||
| 		} | ||||
|  | ||||
| 		if (isset($stati[$code]) AND $text == '') | ||||
| 		{ | ||||
| 			$text = $stati[$code]; | ||||
| 		} | ||||
|  | ||||
| 		if ($text == '') | ||||
| 		{ | ||||
| 			show_error('No status text available.  Please check your status code number or supply your own message text.', 500); | ||||
| 		} | ||||
|  | ||||
| 		$server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE; | ||||
|  | ||||
| 		if (substr(php_sapi_name(), 0, 3) == 'cgi') | ||||
| 		{ | ||||
| 			header("Status: {$code} {$text}", TRUE); | ||||
| 		} | ||||
| 		elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0') | ||||
| 		{ | ||||
| 			header($server_protocol." {$code} {$text}", TRUE, $code); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			header("HTTP/1.1 {$code} {$text}", TRUE, $code); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
| * Exception Handler | ||||
| * | ||||
| * This is the custom exception handler that is declaired at the top | ||||
| * of Codeigniter.php.  The main reason we use this is to permit | ||||
| * PHP errors to be logged in our own log files since the user may | ||||
| * not have access to server logs. Since this function | ||||
| * effectively intercepts PHP errors, however, we also need | ||||
| * to display errors based on the current error_reporting level. | ||||
| * We do that with the use of a PHP error template. | ||||
| * | ||||
| * @access	private | ||||
| * @return	void | ||||
| */ | ||||
| if ( ! function_exists('_exception_handler')) | ||||
| { | ||||
| 	function _exception_handler($severity, $message, $filepath, $line) | ||||
| 	{ | ||||
| 		 // We don't bother with "strict" notices since they tend to fill up | ||||
| 		 // the log file with excess information that isn't normally very helpful. | ||||
| 		 // For example, if you are running PHP 5 and you use version 4 style | ||||
| 		 // class functions (without prefixes like "public", "private", etc.) | ||||
| 		 // you'll get notices telling you that these have been deprecated. | ||||
| 		if ($severity == E_STRICT) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$_error =& load_class('Exceptions', 'core'); | ||||
|  | ||||
| 		// Should we display the error? We'll get the current error_reporting | ||||
| 		// level and add its bits with the severity bits to find out. | ||||
| 		if (($severity & error_reporting()) == $severity) | ||||
| 		{ | ||||
| 			$_error->show_php_error($severity, $message, $filepath, $line); | ||||
| 		} | ||||
|  | ||||
| 		// Should we log the error?  No?  We're done... | ||||
| 		if (config_item('log_threshold') == 0) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$_error->log_exception($severity, $message, $filepath, $line); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Remove Invisible Characters | ||||
|  * | ||||
|  * This prevents sandwiching null characters | ||||
|  * between ascii characters, like Java\0script. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('remove_invisible_characters')) | ||||
| { | ||||
| 	function remove_invisible_characters($str, $url_encoded = TRUE) | ||||
| 	{ | ||||
| 		$non_displayables = array(); | ||||
| 		 | ||||
| 		// every control character except newline (dec 10) | ||||
| 		// carriage return (dec 13), and horizontal tab (dec 09) | ||||
| 		 | ||||
| 		if ($url_encoded) | ||||
| 		{ | ||||
| 			$non_displayables[] = '/%0[0-8bcef]/';	// url encoded 00-08, 11, 12, 14, 15 | ||||
| 			$non_displayables[] = '/%1[0-9a-f]/';	// url encoded 16-31 | ||||
| 		} | ||||
| 		 | ||||
| 		$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';	// 00-08, 11, 12, 14-31, 127 | ||||
|  | ||||
| 		do | ||||
| 		{ | ||||
| 			$str = preg_replace($non_displayables, '', $str, -1, $count); | ||||
| 		} | ||||
| 		while ($count); | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
| * Returns HTML escaped variable | ||||
| * | ||||
| * @access	public | ||||
| * @param	mixed | ||||
| * @return	mixed | ||||
| */ | ||||
| if ( ! function_exists('html_escape')) | ||||
| { | ||||
| 	function html_escape($var) | ||||
| 	{ | ||||
| 		if (is_array($var)) | ||||
| 		{ | ||||
| 			return array_map('html_escape', $var); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return htmlspecialchars($var, ENT_QUOTES, config_item('charset')); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file Common.php */ | ||||
| /* Location: ./system/core/Common.php */ | ||||
							
								
								
									
										379
									
								
								system/core/Config.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										379
									
								
								system/core/Config.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,379 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Config Class | ||||
|  * | ||||
|  * This class contains functions that enable config files to be managed | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Libraries | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/config.html | ||||
|  */ | ||||
| class CI_Config { | ||||
|  | ||||
| 	/** | ||||
| 	 * List of all loaded config values | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $config = array(); | ||||
| 	/** | ||||
| 	 * List of all loaded config files | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $is_loaded = array(); | ||||
| 	/** | ||||
| 	 * List of paths to search when trying to load a config file | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $_config_paths = array(APPPATH); | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Sets the $config data from the primary config.php file as a class variable | ||||
| 	 * | ||||
| 	 * @access   public | ||||
| 	 * @param   string	the config file name | ||||
| 	 * @param   boolean  if configuration values should be loaded into their own section | ||||
| 	 * @param   boolean  true if errors should just return false, false if an error message should be displayed | ||||
| 	 * @return  boolean  if the file was successfully loaded or not | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		$this->config =& get_config(); | ||||
| 		log_message('debug', "Config Class Initialized"); | ||||
|  | ||||
| 		// Set the base_url automatically if none was provided | ||||
| 		if ($this->config['base_url'] == '') | ||||
| 		{ | ||||
| 			if (isset($_SERVER['HTTP_HOST'])) | ||||
| 			{ | ||||
| 				$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http'; | ||||
| 				$base_url .= '://'. $_SERVER['HTTP_HOST']; | ||||
| 				$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']); | ||||
| 			} | ||||
|  | ||||
| 			else | ||||
| 			{ | ||||
| 				$base_url = 'http://localhost/'; | ||||
| 			} | ||||
|  | ||||
| 			$this->set_item('base_url', $base_url); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Load Config File | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the config file name | ||||
| 	 * @param   boolean  if configuration values should be loaded into their own section | ||||
| 	 * @param   boolean  true if errors should just return false, false if an error message should be displayed | ||||
| 	 * @return	boolean	if the file was loaded correctly | ||||
| 	 */ | ||||
| 	function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) | ||||
| 	{ | ||||
| 		$file = ($file == '') ? 'config' : str_replace('.php', '', $file); | ||||
| 		$found = FALSE; | ||||
| 		$loaded = FALSE; | ||||
|  | ||||
| 		$check_locations = defined('ENVIRONMENT') | ||||
| 			? array(ENVIRONMENT.'/'.$file, $file) | ||||
| 			: array($file); | ||||
|  | ||||
| 		foreach ($this->_config_paths as $path) | ||||
| 		{ | ||||
| 			foreach ($check_locations as $location) | ||||
| 			{ | ||||
| 				$file_path = $path.'config/'.$location.'.php'; | ||||
|  | ||||
| 				if (in_array($file_path, $this->is_loaded, TRUE)) | ||||
| 				{ | ||||
| 					$loaded = TRUE; | ||||
| 					continue 2; | ||||
| 				} | ||||
|  | ||||
| 				if (file_exists($file_path)) | ||||
| 				{ | ||||
| 					$found = TRUE; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if ($found === FALSE) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			include($file_path); | ||||
|  | ||||
| 			if ( ! isset($config) OR ! is_array($config)) | ||||
| 			{ | ||||
| 				if ($fail_gracefully === TRUE) | ||||
| 				{ | ||||
| 					return FALSE; | ||||
| 				} | ||||
| 				show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); | ||||
| 			} | ||||
|  | ||||
| 			if ($use_sections === TRUE) | ||||
| 			{ | ||||
| 				if (isset($this->config[$file])) | ||||
| 				{ | ||||
| 					$this->config[$file] = array_merge($this->config[$file], $config); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$this->config[$file] = $config; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$this->config = array_merge($this->config, $config); | ||||
| 			} | ||||
|  | ||||
| 			$this->is_loaded[] = $file_path; | ||||
| 			unset($config); | ||||
|  | ||||
| 			$loaded = TRUE; | ||||
| 			log_message('debug', 'Config file loaded: '.$file_path); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		if ($loaded === FALSE) | ||||
| 		{ | ||||
| 			if ($fail_gracefully === TRUE) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 			show_error('The configuration file '.$file.'.php does not exist.'); | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a config file item | ||||
| 	 * | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the config item name | ||||
| 	 * @param	string	the index name | ||||
| 	 * @param	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function item($item, $index = '') | ||||
| 	{ | ||||
| 		if ($index == '') | ||||
| 		{ | ||||
| 			if ( ! isset($this->config[$item])) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			$pref = $this->config[$item]; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if ( ! isset($this->config[$index])) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			if ( ! isset($this->config[$index][$item])) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			$pref = $this->config[$index][$item]; | ||||
| 		} | ||||
|  | ||||
| 		return $pref; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a config file item - adds slash after item (if item is not empty) | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the config item name | ||||
| 	 * @param	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function slash_item($item) | ||||
| 	{ | ||||
| 		if ( ! isset($this->config[$item])) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		if( trim($this->config[$item]) == '') | ||||
| 		{ | ||||
| 			return ''; | ||||
| 		} | ||||
|  | ||||
| 		return rtrim($this->config[$item], '/').'/'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Site URL | ||||
| 	 * Returns base_url . index_page [. uri_string] | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the URI string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function site_url($uri = '') | ||||
| 	{ | ||||
| 		if ($uri == '') | ||||
| 		{ | ||||
| 			return $this->slash_item('base_url').$this->item('index_page'); | ||||
| 		} | ||||
|  | ||||
| 		if ($this->item('enable_query_strings') == FALSE) | ||||
| 		{ | ||||
| 			$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix'); | ||||
| 			return $this->slash_item('base_url').$this->slash_item('index_page').$this->_uri_string($uri).$suffix; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// ------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Base URL | ||||
| 	 * Returns base_url [. uri_string] | ||||
| 	 * | ||||
| 	 * @access public | ||||
| 	 * @param string $uri | ||||
| 	 * @return string | ||||
| 	 */ | ||||
| 	function base_url($uri = '') | ||||
| 	{ | ||||
| 		return $this->slash_item('base_url').ltrim($this->_uri_string($uri), '/'); | ||||
| 	} | ||||
|  | ||||
| 	// ------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Build URI string for use in Config::site_url() and Config::base_url() | ||||
| 	 * | ||||
| 	 * @access protected | ||||
| 	 * @param  $uri | ||||
| 	 * @return string | ||||
| 	 */ | ||||
| 	protected function _uri_string($uri) | ||||
| 	{ | ||||
| 		if ($this->item('enable_query_strings') == FALSE) | ||||
| 		{ | ||||
| 			if (is_array($uri)) | ||||
| 			{ | ||||
| 				$uri = implode('/', $uri); | ||||
| 			} | ||||
| 			$uri = trim($uri, '/'); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if (is_array($uri)) | ||||
| 			{ | ||||
| 				$i = 0; | ||||
| 				$str = ''; | ||||
| 				foreach ($uri as $key => $val) | ||||
| 				{ | ||||
| 					$prefix = ($i == 0) ? '' : '&'; | ||||
| 					$str .= $prefix.$key.'='.$val; | ||||
| 					$i++; | ||||
| 				} | ||||
| 				$uri = $str; | ||||
| 			} | ||||
| 		} | ||||
| 	    return $uri; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * System URL | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function system_url() | ||||
| 	{ | ||||
| 		$x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH)); | ||||
| 		return $this->slash_item('base_url').end($x).'/'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set a config file item | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the config item key | ||||
| 	 * @param	string	the config item value | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_item($item, $value) | ||||
| 	{ | ||||
| 		$this->config[$item] = $value; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Assign to Config | ||||
| 	 * | ||||
| 	 * This function is called by the front controller (CodeIgniter.php) | ||||
| 	 * after the Config class is instantiated.  It permits config items | ||||
| 	 * to be assigned or overriden by variables contained in the index.php file | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _assign_to_config($items = array()) | ||||
| 	{ | ||||
| 		if (is_array($items)) | ||||
| 		{ | ||||
| 			foreach ($items as $key => $val) | ||||
| 			{ | ||||
| 				$this->set_item($key, $val); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // END CI_Config class | ||||
|  | ||||
| /* End of file Config.php */ | ||||
| /* Location: ./system/core/Config.php */ | ||||
							
								
								
									
										64
									
								
								system/core/Controller.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								system/core/Controller.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Application Controller Class | ||||
|  * | ||||
|  * This class object is the super class that every library in | ||||
|  * CodeIgniter will be assigned to. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Libraries | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/general/controllers.html | ||||
|  */ | ||||
| class CI_Controller { | ||||
|  | ||||
| 	private static $instance; | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 */ | ||||
| 	public function __construct() | ||||
| 	{ | ||||
| 		self::$instance =& $this; | ||||
| 		 | ||||
| 		// Assign all the class objects that were instantiated by the | ||||
| 		// bootstrap file (CodeIgniter.php) to local class variables | ||||
| 		// so that CI can run as one big super object. | ||||
| 		foreach (is_loaded() as $var => $class) | ||||
| 		{ | ||||
| 			$this->$var =& load_class($class); | ||||
| 		} | ||||
|  | ||||
| 		$this->load =& load_class('Loader', 'core'); | ||||
|  | ||||
| 		$this->load->initialize(); | ||||
| 		 | ||||
| 		log_message('debug', "Controller Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	public static function &get_instance() | ||||
| 	{ | ||||
| 		return self::$instance; | ||||
| 	} | ||||
| } | ||||
| // END Controller class | ||||
|  | ||||
| /* End of file Controller.php */ | ||||
| /* Location: ./system/core/Controller.php */ | ||||
							
								
								
									
										193
									
								
								system/core/Exceptions.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								system/core/Exceptions.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,193 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Exceptions Class | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Exceptions | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/exceptions.html | ||||
|  */ | ||||
| class CI_Exceptions { | ||||
| 	var $action; | ||||
| 	var $severity; | ||||
| 	var $message; | ||||
| 	var $filename; | ||||
| 	var $line; | ||||
|  | ||||
| 	/** | ||||
| 	 * Nesting level of the output buffering mechanism | ||||
| 	 * | ||||
| 	 * @var int | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $ob_level; | ||||
|  | ||||
| 	/** | ||||
| 	 * List if available error levels | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $levels = array( | ||||
| 						E_ERROR				=>	'Error', | ||||
| 						E_WARNING			=>	'Warning', | ||||
| 						E_PARSE				=>	'Parsing Error', | ||||
| 						E_NOTICE			=>	'Notice', | ||||
| 						E_CORE_ERROR		=>	'Core Error', | ||||
| 						E_CORE_WARNING		=>	'Core Warning', | ||||
| 						E_COMPILE_ERROR		=>	'Compile Error', | ||||
| 						E_COMPILE_WARNING	=>	'Compile Warning', | ||||
| 						E_USER_ERROR		=>	'User Error', | ||||
| 						E_USER_WARNING		=>	'User Warning', | ||||
| 						E_USER_NOTICE		=>	'User Notice', | ||||
| 						E_STRICT			=>	'Runtime Notice' | ||||
| 					); | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 */ | ||||
| 	public function __construct() | ||||
| 	{ | ||||
| 		$this->ob_level = ob_get_level(); | ||||
| 		// Note:  Do not log messages from this constructor. | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Exception Logger | ||||
| 	 * | ||||
| 	 * This function logs PHP generated error messages | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the error severity | ||||
| 	 * @param	string	the error string | ||||
| 	 * @param	string	the error filepath | ||||
| 	 * @param	string	the error line number | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function log_exception($severity, $message, $filepath, $line) | ||||
| 	{ | ||||
| 		$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; | ||||
|  | ||||
| 		log_message('error', 'Severity: '.$severity.'  --> '.$message. ' '.$filepath.' '.$line, TRUE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * 404 Page Not Found Handler | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the page | ||||
| 	 * @param 	bool	log error yes/no | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function show_404($page = '', $log_error = TRUE) | ||||
| 	{ | ||||
| 		$heading = "404 Page Not Found"; | ||||
| 		$message = "The page you requested was not found."; | ||||
|  | ||||
| 		// By default we log this, but allow a dev to skip it | ||||
| 		if ($log_error) | ||||
| 		{ | ||||
| 			log_message('error', '404 Page Not Found --> '.$page); | ||||
| 		} | ||||
|  | ||||
| 		echo $this->show_error($heading, $message, 'error_404', 404); | ||||
| 		exit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * General Error Page | ||||
| 	 * | ||||
| 	 * This function takes an error message as input | ||||
| 	 * (either as a string or an array) and displays | ||||
| 	 * it using the specified template. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the heading | ||||
| 	 * @param	string	the message | ||||
| 	 * @param	string	the template name | ||||
| 	 * @param 	int		the status code | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function show_error($heading, $message, $template = 'error_general', $status_code = 500) | ||||
| 	{ | ||||
| 		set_status_header($status_code); | ||||
|  | ||||
| 		$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>'; | ||||
|  | ||||
| 		if (ob_get_level() > $this->ob_level + 1) | ||||
| 		{ | ||||
| 			ob_end_flush(); | ||||
| 		} | ||||
| 		ob_start(); | ||||
| 		include(APPPATH.'errors/'.$template.'.php'); | ||||
| 		$buffer = ob_get_contents(); | ||||
| 		ob_end_clean(); | ||||
| 		return $buffer; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Native PHP error handler | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the error severity | ||||
| 	 * @param	string	the error string | ||||
| 	 * @param	string	the error filepath | ||||
| 	 * @param	string	the error line number | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function show_php_error($severity, $message, $filepath, $line) | ||||
| 	{ | ||||
| 		$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; | ||||
|  | ||||
| 		$filepath = str_replace("\\", "/", $filepath); | ||||
|  | ||||
| 		// For safety reasons we do not show the full file path | ||||
| 		if (FALSE !== strpos($filepath, '/')) | ||||
| 		{ | ||||
| 			$x = explode('/', $filepath); | ||||
| 			$filepath = $x[count($x)-2].'/'.end($x); | ||||
| 		} | ||||
|  | ||||
| 		if (ob_get_level() > $this->ob_level + 1) | ||||
| 		{ | ||||
| 			ob_end_flush(); | ||||
| 		} | ||||
| 		ob_start(); | ||||
| 		include(APPPATH.'errors/error_php.php'); | ||||
| 		$buffer = ob_get_contents(); | ||||
| 		ob_end_clean(); | ||||
| 		echo $buffer; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
| // END Exceptions Class | ||||
|  | ||||
| /* End of file Exceptions.php */ | ||||
| /* Location: ./system/core/Exceptions.php */ | ||||
							
								
								
									
										248
									
								
								system/core/Hooks.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								system/core/Hooks.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,248 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Hooks Class | ||||
|  * | ||||
|  * Provides a mechanism to extend the base system without hacking. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Libraries | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/encryption.html | ||||
|  */ | ||||
| class CI_Hooks { | ||||
|  | ||||
| 	/** | ||||
| 	 * Determines wether hooks are enabled | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	var $enabled		= FALSE; | ||||
| 	/** | ||||
| 	 * List of all hooks set in config/hooks.php | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $hooks			= array(); | ||||
| 	/** | ||||
| 	 * Determines wether hook is in progress, used to prevent infinte loops | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	var $in_progress	= FALSE; | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		$this->_initialize(); | ||||
| 		log_message('debug', "Hooks Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Initialize the Hooks Preferences | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _initialize() | ||||
| 	{ | ||||
| 		$CFG =& load_class('Config', 'core'); | ||||
|  | ||||
| 		// If hooks are not enabled in the config file | ||||
| 		// there is nothing else to do | ||||
|  | ||||
| 		if ($CFG->item('enable_hooks') == FALSE) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		// Grab the "hooks" definition file. | ||||
| 		// If there are no hooks, we're done. | ||||
|  | ||||
| 		if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) | ||||
| 		{ | ||||
| 		    include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); | ||||
| 		} | ||||
| 		elseif (is_file(APPPATH.'config/hooks.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/hooks.php'); | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		if ( ! isset($hook) OR ! is_array($hook)) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$this->hooks =& $hook; | ||||
| 		$this->enabled = TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Call Hook | ||||
| 	 * | ||||
| 	 * Calls a particular hook | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the hook name | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _call_hook($which = '') | ||||
| 	{ | ||||
| 		if ( ! $this->enabled OR ! isset($this->hooks[$which])) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0])) | ||||
| 		{ | ||||
| 			foreach ($this->hooks[$which] as $val) | ||||
| 			{ | ||||
| 				$this->_run_hook($val); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->_run_hook($this->hooks[$which]); | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Run Hook | ||||
| 	 * | ||||
| 	 * Runs a particular hook | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	the hook details | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _run_hook($data) | ||||
| 	{ | ||||
| 		if ( ! is_array($data)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Safety - Prevents run-away loops | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		// If the script being called happens to have the same | ||||
| 		// hook call within it a loop can happen | ||||
|  | ||||
| 		if ($this->in_progress == TRUE) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Set file path | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		if ( ! isset($data['filepath']) OR ! isset($data['filename'])) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$filepath = APPPATH.$data['filepath'].'/'.$data['filename']; | ||||
|  | ||||
| 		if ( ! file_exists($filepath)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Set class/function name | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$class		= FALSE; | ||||
| 		$function	= FALSE; | ||||
| 		$params		= ''; | ||||
|  | ||||
| 		if (isset($data['class']) AND $data['class'] != '') | ||||
| 		{ | ||||
| 			$class = $data['class']; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($data['function'])) | ||||
| 		{ | ||||
| 			$function = $data['function']; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($data['params'])) | ||||
| 		{ | ||||
| 			$params = $data['params']; | ||||
| 		} | ||||
|  | ||||
| 		if ($class === FALSE AND $function === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Set the in_progress flag | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$this->in_progress = TRUE; | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Call the requested class and/or function | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		if ($class !== FALSE) | ||||
| 		{ | ||||
| 			if ( ! class_exists($class)) | ||||
| 			{ | ||||
| 				require($filepath); | ||||
| 			} | ||||
|  | ||||
| 			$HOOK = new $class; | ||||
| 			$HOOK->$function($params); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if ( ! function_exists($function)) | ||||
| 			{ | ||||
| 				require($filepath); | ||||
| 			} | ||||
|  | ||||
| 			$function($params); | ||||
| 		} | ||||
|  | ||||
| 		$this->in_progress = FALSE; | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| // END CI_Hooks class | ||||
|  | ||||
| /* End of file Hooks.php */ | ||||
| /* Location: ./system/core/Hooks.php */ | ||||
							
								
								
									
										849
									
								
								system/core/Input.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										849
									
								
								system/core/Input.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,849 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Input Class | ||||
|  * | ||||
|  * Pre-processes global input data for security | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Input | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/input.html | ||||
|  */ | ||||
| class CI_Input { | ||||
|  | ||||
| 	/** | ||||
| 	 * IP address of the current user | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 */ | ||||
| 	var $ip_address				= FALSE; | ||||
| 	/** | ||||
| 	 * user agent (web browser) being used by the current user | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 */ | ||||
| 	var $user_agent				= FALSE; | ||||
| 	/** | ||||
| 	 * If FALSE, then $_GET will be set to an empty array | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	var $_allow_get_array		= TRUE; | ||||
| 	/** | ||||
| 	 * If TRUE, then newlines are standardized | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	var $_standardize_newlines	= TRUE; | ||||
| 	/** | ||||
| 	 * Determines whether the XSS filter is always active when GET, POST or COOKIE data is encountered | ||||
| 	 * Set automatically based on config setting | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	var $_enable_xss			= FALSE; | ||||
| 	/** | ||||
| 	 * Enables a CSRF cookie token to be set. | ||||
| 	 * Set automatically based on config setting | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	var $_enable_csrf			= FALSE; | ||||
| 	/** | ||||
| 	 * List of all HTTP request headers | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	protected $headers			= array(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Sets whether to globally enable the XSS processing | ||||
| 	 * and whether to allow the $_GET array | ||||
| 	 * | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct() | ||||
| 	{ | ||||
| 		log_message('debug', "Input Class Initialized"); | ||||
|  | ||||
| 		$this->_allow_get_array	= (config_item('allow_get_array') === TRUE); | ||||
| 		$this->_enable_xss		= (config_item('global_xss_filtering') === TRUE); | ||||
| 		$this->_enable_csrf		= (config_item('csrf_protection') === TRUE); | ||||
|  | ||||
| 		global $SEC; | ||||
| 		$this->security =& $SEC; | ||||
|  | ||||
| 		// Do we need the UTF-8 class? | ||||
| 		if (UTF8_ENABLED === TRUE) | ||||
| 		{ | ||||
| 			global $UNI; | ||||
| 			$this->uni =& $UNI; | ||||
| 		} | ||||
|  | ||||
| 		// Sanitize global arrays | ||||
| 		$this->_sanitize_globals(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch from array | ||||
| 	 * | ||||
| 	 * This is a helper function to retrieve values from global arrays | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array | ||||
| 	 * @param	string | ||||
| 	 * @param	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		if ( ! isset($array[$index])) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if ($xss_clean === TRUE) | ||||
| 		{ | ||||
| 			return $this->security->xss_clean($array[$index]); | ||||
| 		} | ||||
|  | ||||
| 		return $array[$index]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Fetch an item from the GET array | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	string | ||||
| 	* @param	bool | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function get($index = NULL, $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		// Check if a field has been provided | ||||
| 		if ($index === NULL AND ! empty($_GET)) | ||||
| 		{ | ||||
| 			$get = array(); | ||||
|  | ||||
| 			// loop through the full _GET array | ||||
| 			foreach (array_keys($_GET) as $key) | ||||
| 			{ | ||||
| 				$get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean); | ||||
| 			} | ||||
| 			return $get; | ||||
| 		} | ||||
|  | ||||
| 		return $this->_fetch_from_array($_GET, $index, $xss_clean); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Fetch an item from the POST array | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	string | ||||
| 	* @param	bool | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function post($index = NULL, $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		// Check if a field has been provided | ||||
| 		if ($index === NULL AND ! empty($_POST)) | ||||
| 		{ | ||||
| 			$post = array(); | ||||
|  | ||||
| 			// Loop through the full _POST array and return it | ||||
| 			foreach (array_keys($_POST) as $key) | ||||
| 			{ | ||||
| 				$post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean); | ||||
| 			} | ||||
| 			return $post; | ||||
| 		} | ||||
|  | ||||
| 		return $this->_fetch_from_array($_POST, $index, $xss_clean); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Fetch an item from either the GET array or the POST | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	string	The index key | ||||
| 	* @param	bool	XSS cleaning | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function get_post($index = '', $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		if ( ! isset($_POST[$index]) ) | ||||
| 		{ | ||||
| 			return $this->get($index, $xss_clean); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return $this->post($index, $xss_clean); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Fetch an item from the COOKIE array | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	string | ||||
| 	* @param	bool | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function cookie($index = '', $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); | ||||
| 	} | ||||
|  | ||||
| 	// ------------------------------------------------------------------------ | ||||
|  | ||||
| 	/** | ||||
| 	* Set cookie | ||||
| 	* | ||||
| 	* Accepts six parameter, or you can submit an associative | ||||
| 	* array in the first parameter containing all the values. | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	mixed | ||||
| 	* @param	string	the value of the cookie | ||||
| 	* @param	string	the number of seconds until expiration | ||||
| 	* @param	string	the cookie domain.  Usually:  .yourdomain.com | ||||
| 	* @param	string	the cookie path | ||||
| 	* @param	string	the cookie prefix | ||||
| 	* @param	bool	true makes the cookie secure | ||||
| 	* @return	void | ||||
| 	*/ | ||||
| 	function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($name)) | ||||
| 		{ | ||||
| 			// always leave 'name' in last place, as the loop will break otherwise, due to $$item | ||||
| 			foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item) | ||||
| 			{ | ||||
| 				if (isset($name[$item])) | ||||
| 				{ | ||||
| 					$$item = $name[$item]; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($prefix == '' AND config_item('cookie_prefix') != '') | ||||
| 		{ | ||||
| 			$prefix = config_item('cookie_prefix'); | ||||
| 		} | ||||
| 		if ($domain == '' AND config_item('cookie_domain') != '') | ||||
| 		{ | ||||
| 			$domain = config_item('cookie_domain'); | ||||
| 		} | ||||
| 		if ($path == '/' AND config_item('cookie_path') != '/') | ||||
| 		{ | ||||
| 			$path = config_item('cookie_path'); | ||||
| 		} | ||||
| 		if ($secure == FALSE AND config_item('cookie_secure') != FALSE) | ||||
| 		{ | ||||
| 			$secure = config_item('cookie_secure'); | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_numeric($expire)) | ||||
| 		{ | ||||
| 			$expire = time() - 86500; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$expire = ($expire > 0) ? time() + $expire : 0; | ||||
| 		} | ||||
|  | ||||
| 		setcookie($prefix.$name, $value, $expire, $path, $domain, $secure); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Fetch an item from the SERVER array | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	string | ||||
| 	* @param	bool | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function server($index = '', $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		return $this->_fetch_from_array($_SERVER, $index, $xss_clean); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Fetch the IP Address | ||||
| 	* | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	public function ip_address() | ||||
| 	{ | ||||
| 		if ($this->ip_address !== FALSE) | ||||
| 		{ | ||||
| 			return $this->ip_address; | ||||
| 		} | ||||
|  | ||||
| 		$proxy_ips = config_item('proxy_ips'); | ||||
| 		if ( ! empty($proxy_ips)) | ||||
| 		{ | ||||
| 			$proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); | ||||
| 			foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) | ||||
| 			{ | ||||
| 				if (($spoof = $this->server($header)) !== FALSE) | ||||
| 				{ | ||||
| 					// Some proxies typically list the whole chain of IP | ||||
| 					// addresses through which the client has reached us. | ||||
| 					// e.g. client_ip, proxy_ip1, proxy_ip2, etc. | ||||
| 					if (strpos($spoof, ',') !== FALSE) | ||||
| 					{ | ||||
| 						$spoof = explode(',', $spoof, 2); | ||||
| 						$spoof = $spoof[0]; | ||||
| 					} | ||||
|  | ||||
| 					if ( ! $this->valid_ip($spoof)) | ||||
| 					{ | ||||
| 						$spoof = FALSE; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			$this->ip_address = ($spoof !== FALSE && in_array($_SERVER['REMOTE_ADDR'], $proxy_ips, TRUE)) | ||||
| 				? $spoof : $_SERVER['REMOTE_ADDR']; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->ip_address = $_SERVER['REMOTE_ADDR']; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! $this->valid_ip($this->ip_address)) | ||||
| 		{ | ||||
| 			$this->ip_address = '0.0.0.0'; | ||||
| 		} | ||||
|  | ||||
| 		return $this->ip_address; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Validate IP Address | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @param	string | ||||
| 	* @param	string	ipv4 or ipv6 | ||||
| 	* @return	bool | ||||
| 	*/ | ||||
| 	public function valid_ip($ip, $which = '') | ||||
| 	{ | ||||
| 		$which = strtolower($which); | ||||
|  | ||||
| 		// First check if filter_var is available | ||||
| 		if (is_callable('filter_var')) | ||||
| 		{ | ||||
| 			switch ($which) { | ||||
| 				case 'ipv4': | ||||
| 					$flag = FILTER_FLAG_IPV4; | ||||
| 					break; | ||||
| 				case 'ipv6': | ||||
| 					$flag = FILTER_FLAG_IPV6; | ||||
| 					break; | ||||
| 				default: | ||||
| 					$flag = ''; | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flag); | ||||
| 		} | ||||
|  | ||||
| 		if ($which !== 'ipv6' && $which !== 'ipv4') | ||||
| 		{ | ||||
| 			if (strpos($ip, ':') !== FALSE) | ||||
| 			{ | ||||
| 				$which = 'ipv6'; | ||||
| 			} | ||||
| 			elseif (strpos($ip, '.') !== FALSE) | ||||
| 			{ | ||||
| 				$which = 'ipv4'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$func = '_valid_'.$which; | ||||
| 		return $this->$func($ip); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Validate IPv4 Address | ||||
| 	* | ||||
| 	* Updated version suggested by Geert De Deckere | ||||
| 	* | ||||
| 	* @access	protected | ||||
| 	* @param	string | ||||
| 	* @return	bool | ||||
| 	*/ | ||||
| 	protected function _valid_ipv4($ip) | ||||
| 	{ | ||||
| 		$ip_segments = explode('.', $ip); | ||||
|  | ||||
| 		// Always 4 segments needed | ||||
| 		if (count($ip_segments) !== 4) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		// IP can not start with 0 | ||||
| 		if ($ip_segments[0][0] == '0') | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// Check each segment | ||||
| 		foreach ($ip_segments as $segment) | ||||
| 		{ | ||||
| 			// IP segments must be digits and can not be | ||||
| 			// longer than 3 digits or greater then 255 | ||||
| 			if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Validate IPv6 Address | ||||
| 	* | ||||
| 	* @access	protected | ||||
| 	* @param	string | ||||
| 	* @return	bool | ||||
| 	*/ | ||||
| 	protected function _valid_ipv6($str) | ||||
| 	{ | ||||
| 		// 8 groups, separated by : | ||||
| 		// 0-ffff per group | ||||
| 		// one set of consecutive 0 groups can be collapsed to :: | ||||
|  | ||||
| 		$groups = 8; | ||||
| 		$collapsed = FALSE; | ||||
|  | ||||
| 		$chunks = array_filter( | ||||
| 			preg_split('/(:{1,2})/', $str, NULL, PREG_SPLIT_DELIM_CAPTURE) | ||||
| 		); | ||||
|  | ||||
| 		// Rule out easy nonsense | ||||
| 		if (current($chunks) == ':' OR end($chunks) == ':') | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// PHP supports IPv4-mapped IPv6 addresses, so we'll expect those as well | ||||
| 		if (strpos(end($chunks), '.') !== FALSE) | ||||
| 		{ | ||||
| 			$ipv4 = array_pop($chunks); | ||||
|  | ||||
| 			if ( ! $this->_valid_ipv4($ipv4)) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			$groups--; | ||||
| 		} | ||||
|  | ||||
| 		while ($seg = array_pop($chunks)) | ||||
| 		{ | ||||
| 			if ($seg[0] == ':') | ||||
| 			{ | ||||
| 				if (--$groups == 0) | ||||
| 				{ | ||||
| 					return FALSE;	// too many groups | ||||
| 				} | ||||
|  | ||||
| 				if (strlen($seg) > 2) | ||||
| 				{ | ||||
| 					return FALSE;	// long separator | ||||
| 				} | ||||
|  | ||||
| 				if ($seg == '::') | ||||
| 				{ | ||||
| 					if ($collapsed) | ||||
| 					{ | ||||
| 						return FALSE;	// multiple collapsed | ||||
| 					} | ||||
|  | ||||
| 					$collapsed = TRUE; | ||||
| 				} | ||||
| 			} | ||||
| 			elseif (preg_match("/[^0-9a-f]/i", $seg) OR strlen($seg) > 4) | ||||
| 			{ | ||||
| 				return FALSE; // invalid segment | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $collapsed OR $groups == 1; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* User Agent | ||||
| 	* | ||||
| 	* @access	public | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function user_agent() | ||||
| 	{ | ||||
| 		if ($this->user_agent !== FALSE) | ||||
| 		{ | ||||
| 			return $this->user_agent; | ||||
| 		} | ||||
|  | ||||
| 		$this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT']; | ||||
|  | ||||
| 		return $this->user_agent; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Sanitize Globals | ||||
| 	* | ||||
| 	* This function does the following: | ||||
| 	* | ||||
| 	* Unsets $_GET data (if query strings are not enabled) | ||||
| 	* | ||||
| 	* Unsets all globals if register_globals is enabled | ||||
| 	* | ||||
| 	* Standardizes newline characters to \n | ||||
| 	* | ||||
| 	* @access	private | ||||
| 	* @return	void | ||||
| 	*/ | ||||
| 	function _sanitize_globals() | ||||
| 	{ | ||||
| 		// It would be "wrong" to unset any of these GLOBALS. | ||||
| 		$protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', | ||||
| 							'_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA', | ||||
| 							'system_folder', 'application_folder', 'BM', 'EXT', | ||||
| 							'CFG', 'URI', 'RTR', 'OUT', 'IN'); | ||||
|  | ||||
| 		// Unset globals for securiy. | ||||
| 		// This is effectively the same as register_globals = off | ||||
| 		foreach (array($_GET, $_POST, $_COOKIE) as $global) | ||||
| 		{ | ||||
| 			if ( ! is_array($global)) | ||||
| 			{ | ||||
| 				if ( ! in_array($global, $protected)) | ||||
| 				{ | ||||
| 					global $$global; | ||||
| 					$$global = NULL; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				foreach ($global as $key => $val) | ||||
| 				{ | ||||
| 					if ( ! in_array($key, $protected)) | ||||
| 					{ | ||||
| 						global $$key; | ||||
| 						$$key = NULL; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Is $_GET data allowed? If not we'll set the $_GET to an empty array | ||||
| 		if ($this->_allow_get_array == FALSE) | ||||
| 		{ | ||||
| 			$_GET = array(); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if (is_array($_GET) AND count($_GET) > 0) | ||||
| 			{ | ||||
| 				foreach ($_GET as $key => $val) | ||||
| 				{ | ||||
| 					$_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Clean $_POST Data | ||||
| 		if (is_array($_POST) AND count($_POST) > 0) | ||||
| 		{ | ||||
| 			foreach ($_POST as $key => $val) | ||||
| 			{ | ||||
| 				$_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Clean $_COOKIE Data | ||||
| 		if (is_array($_COOKIE) AND count($_COOKIE) > 0) | ||||
| 		{ | ||||
| 			// Also get rid of specially treated cookies that might be set by a server | ||||
| 			// or silly application, that are of no use to a CI application anyway | ||||
| 			// but that when present will trip our 'Disallowed Key Characters' alarm | ||||
| 			// http://www.ietf.org/rfc/rfc2109.txt | ||||
| 			// note that the key names below are single quoted strings, and are not PHP variables | ||||
| 			unset($_COOKIE['$Version']); | ||||
| 			unset($_COOKIE['$Path']); | ||||
| 			unset($_COOKIE['$Domain']); | ||||
|  | ||||
| 			foreach ($_COOKIE as $key => $val) | ||||
| 			{ | ||||
| 				$_COOKIE[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Sanitize PHP_SELF | ||||
| 		$_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); | ||||
|  | ||||
|  | ||||
| 		// CSRF Protection check on HTTP requests | ||||
| 		if ($this->_enable_csrf == TRUE && ! $this->is_cli_request()) | ||||
| 		{ | ||||
| 			$this->security->csrf_verify(); | ||||
| 		} | ||||
|  | ||||
| 		log_message('debug', "Global POST and COOKIE data sanitized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Clean Input Data | ||||
| 	* | ||||
| 	* This is a helper function. It escapes data and | ||||
| 	* standardizes newline characters to \n | ||||
| 	* | ||||
| 	* @access	private | ||||
| 	* @param	string | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function _clean_input_data($str) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			$new_array = array(); | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); | ||||
| 			} | ||||
| 			return $new_array; | ||||
| 		} | ||||
|  | ||||
| 		/* We strip slashes if magic quotes is on to keep things consistent | ||||
|  | ||||
| 		   NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and | ||||
| 			 it will probably not exist in future versions at all. | ||||
| 		*/ | ||||
| 		if ( ! is_php('5.4') && get_magic_quotes_gpc()) | ||||
| 		{ | ||||
| 			$str = stripslashes($str); | ||||
| 		} | ||||
|  | ||||
| 		// Clean UTF-8 if supported | ||||
| 		if (UTF8_ENABLED === TRUE) | ||||
| 		{ | ||||
| 			$str = $this->uni->clean_string($str); | ||||
| 		} | ||||
|  | ||||
| 		// Remove control characters | ||||
| 		$str = remove_invisible_characters($str); | ||||
|  | ||||
| 		// Should we filter the input data? | ||||
| 		if ($this->_enable_xss === TRUE) | ||||
| 		{ | ||||
| 			$str = $this->security->xss_clean($str); | ||||
| 		} | ||||
|  | ||||
| 		// Standardize newlines if needed | ||||
| 		if ($this->_standardize_newlines == TRUE) | ||||
| 		{ | ||||
| 			if (strpos($str, "\r") !== FALSE) | ||||
| 			{ | ||||
| 				$str = str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Clean Keys | ||||
| 	* | ||||
| 	* This is a helper function. To prevent malicious users | ||||
| 	* from trying to exploit keys we make sure that keys are | ||||
| 	* only named with alpha-numeric text and a few other items. | ||||
| 	* | ||||
| 	* @access	private | ||||
| 	* @param	string | ||||
| 	* @return	string | ||||
| 	*/ | ||||
| 	function _clean_input_keys($str) | ||||
| 	{ | ||||
| 		if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str)) | ||||
| 		{ | ||||
| 			exit('Disallowed Key Characters.'); | ||||
| 		} | ||||
|  | ||||
| 		// Clean UTF-8 if supported | ||||
| 		if (UTF8_ENABLED === TRUE) | ||||
| 		{ | ||||
| 			$str = $this->uni->clean_string($str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Request Headers | ||||
| 	 * | ||||
| 	 * In Apache, you can simply call apache_request_headers(), however for | ||||
| 	 * people running other webservers the function is undefined. | ||||
| 	 * | ||||
| 	 * @param	bool XSS cleaning | ||||
| 	 * | ||||
| 	 * @return array | ||||
| 	 */ | ||||
| 	public function request_headers($xss_clean = FALSE) | ||||
| 	{ | ||||
| 		// Look at Apache go! | ||||
| 		if (function_exists('apache_request_headers')) | ||||
| 		{ | ||||
| 			$headers = apache_request_headers(); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$headers['Content-Type'] = (isset($_SERVER['CONTENT_TYPE'])) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); | ||||
|  | ||||
| 			foreach ($_SERVER as $key => $val) | ||||
| 			{ | ||||
| 				if (strncmp($key, 'HTTP_', 5) === 0) | ||||
| 				{ | ||||
| 					$headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// take SOME_HEADER and turn it into Some-Header | ||||
| 		foreach ($headers as $key => $val) | ||||
| 		{ | ||||
| 			$key = str_replace('_', ' ', strtolower($key)); | ||||
| 			$key = str_replace(' ', '-', ucwords($key)); | ||||
|  | ||||
| 			$this->headers[$key] = $val; | ||||
| 		} | ||||
|  | ||||
| 		return $this->headers; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Get Request Header | ||||
| 	 * | ||||
| 	 * Returns the value of a single member of the headers class member | ||||
| 	 * | ||||
| 	 * @param 	string		array key for $this->headers | ||||
| 	 * @param	boolean		XSS Clean or not | ||||
| 	 * @return 	mixed		FALSE on failure, string on success | ||||
| 	 */ | ||||
| 	public function get_request_header($index, $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		if (empty($this->headers)) | ||||
| 		{ | ||||
| 			$this->request_headers(); | ||||
| 		} | ||||
|  | ||||
| 		if ( ! isset($this->headers[$index])) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if ($xss_clean === TRUE) | ||||
| 		{ | ||||
| 			return $this->security->xss_clean($this->headers[$index]); | ||||
| 		} | ||||
|  | ||||
| 		return $this->headers[$index]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Is ajax Request? | ||||
| 	 * | ||||
| 	 * Test to see if a request contains the HTTP_X_REQUESTED_WITH header | ||||
| 	 * | ||||
| 	 * @return 	boolean | ||||
| 	 */ | ||||
| 	public function is_ajax_request() | ||||
| 	{ | ||||
| 		return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Is cli Request? | ||||
| 	 * | ||||
| 	 * Test to see if a request was made from the command line | ||||
| 	 * | ||||
| 	 * @return 	bool | ||||
| 	 */ | ||||
| 	public function is_cli_request() | ||||
| 	{ | ||||
| 		return (php_sapi_name() === 'cli' OR defined('STDIN')); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file Input.php */ | ||||
| /* Location: ./system/core/Input.php */ | ||||
							
								
								
									
										160
									
								
								system/core/Lang.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								system/core/Lang.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,160 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Language Class | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Language | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/language.html | ||||
|  */ | ||||
| class CI_Lang { | ||||
|  | ||||
| 	/** | ||||
| 	 * List of translations | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $language	= array(); | ||||
| 	/** | ||||
| 	 * List of loaded language files | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	var $is_loaded	= array(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		log_message('debug', "Language Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Load a language file | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	mixed	the name of the language file to be loaded. Can be an array | ||||
| 	 * @param	string	the language (english, etc.) | ||||
| 	 * @param	bool	return loaded array of translations | ||||
| 	 * @param 	bool	add suffix to $langfile | ||||
| 	 * @param 	string	alternative path to look for language file | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '') | ||||
| 	{ | ||||
| 		$langfile = str_replace('.php', '', $langfile); | ||||
|  | ||||
| 		if ($add_suffix == TRUE) | ||||
| 		{ | ||||
| 			$langfile = str_replace('_lang.', '', $langfile).'_lang'; | ||||
| 		} | ||||
|  | ||||
| 		$langfile .= '.php'; | ||||
|  | ||||
| 		if (in_array($langfile, $this->is_loaded, TRUE)) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$config =& get_config(); | ||||
|  | ||||
| 		if ($idiom == '') | ||||
| 		{ | ||||
| 			$deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language']; | ||||
| 			$idiom = ($deft_lang == '') ? 'english' : $deft_lang; | ||||
| 		} | ||||
|  | ||||
| 		// Determine where the language file is and load it | ||||
| 		if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile)) | ||||
| 		{ | ||||
| 			include($alt_path.'language/'.$idiom.'/'.$langfile); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$found = FALSE; | ||||
|  | ||||
| 			foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) | ||||
| 			{ | ||||
| 				if (file_exists($package_path.'language/'.$idiom.'/'.$langfile)) | ||||
| 				{ | ||||
| 					include($package_path.'language/'.$idiom.'/'.$langfile); | ||||
| 					$found = TRUE; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if ($found !== TRUE) | ||||
| 			{ | ||||
| 				show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		if ( ! isset($lang)) | ||||
| 		{ | ||||
| 			log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		if ($return == TRUE) | ||||
| 		{ | ||||
| 			return $lang; | ||||
| 		} | ||||
|  | ||||
| 		$this->is_loaded[] = $langfile; | ||||
| 		$this->language = array_merge($this->language, $lang); | ||||
| 		unset($lang); | ||||
|  | ||||
| 		log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a single line of text from the language array | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	$line	the language line | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function line($line = '') | ||||
| 	{ | ||||
| 		$value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line]; | ||||
|  | ||||
| 		// Because killer robots like unicorns! | ||||
| 		if ($value === FALSE) | ||||
| 		{ | ||||
| 			log_message('error', 'Could not find the language line "'.$line.'"'); | ||||
| 		} | ||||
|  | ||||
| 		return $value; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| // END Language Class | ||||
|  | ||||
| /* End of file Lang.php */ | ||||
| /* Location: ./system/core/Lang.php */ | ||||
							
								
								
									
										1248
									
								
								system/core/Loader.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1248
									
								
								system/core/Loader.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										57
									
								
								system/core/Model.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								system/core/Model.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Model Class | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Libraries | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/config.html | ||||
|  */ | ||||
| class CI_Model { | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		log_message('debug', "Model Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * __get | ||||
| 	 * | ||||
| 	 * Allows models to access CI's loaded classes using the same | ||||
| 	 * syntax as controllers. | ||||
| 	 * | ||||
| 	 * @param	string | ||||
| 	 * @access private | ||||
| 	 */ | ||||
| 	function __get($key) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->$key; | ||||
| 	} | ||||
| } | ||||
| // END Model Class | ||||
|  | ||||
| /* End of file Model.php */ | ||||
| /* Location: ./system/core/Model.php */ | ||||
							
								
								
									
										574
									
								
								system/core/Output.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										574
									
								
								system/core/Output.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,574 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Output Class | ||||
|  * | ||||
|  * Responsible for sending final output to browser | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Output | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/output.html | ||||
|  */ | ||||
| class CI_Output { | ||||
|  | ||||
| 	/** | ||||
| 	 * Current output string | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $final_output; | ||||
| 	/** | ||||
| 	 * Cache expiration time | ||||
| 	 * | ||||
| 	 * @var int | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $cache_expiration	= 0; | ||||
| 	/** | ||||
| 	 * List of server headers | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $headers			= array(); | ||||
| 	/** | ||||
| 	 * List of mime types | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $mime_types		= array(); | ||||
| 	/** | ||||
| 	 * Determines wether profiler is enabled | ||||
| 	 * | ||||
| 	 * @var book | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $enable_profiler	= FALSE; | ||||
| 	/** | ||||
| 	 * Determines if output compression is enabled | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $_zlib_oc			= FALSE; | ||||
| 	/** | ||||
| 	 * List of profiler sections | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $_profiler_sections = array(); | ||||
| 	/** | ||||
| 	 * Whether or not to parse variables like {elapsed_time} and {memory_usage} | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 * @access 	protected | ||||
| 	 */ | ||||
| 	protected $parse_exec_vars	= TRUE; | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		$this->_zlib_oc = @ini_get('zlib.output_compression'); | ||||
|  | ||||
| 		// Get mime types for later | ||||
| 		if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) | ||||
| 		{ | ||||
| 		    include APPPATH.'config/'.ENVIRONMENT.'/mimes.php'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			include APPPATH.'config/mimes.php'; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		$this->mime_types = $mimes; | ||||
|  | ||||
| 		log_message('debug', "Output Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Get Output | ||||
| 	 * | ||||
| 	 * Returns the current output string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function get_output() | ||||
| 	{ | ||||
| 		return $this->final_output; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Output | ||||
| 	 * | ||||
| 	 * Sets the output string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_output($output) | ||||
| 	{ | ||||
| 		$this->final_output = $output; | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Append Output | ||||
| 	 * | ||||
| 	 * Appends data onto the output string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function append_output($output) | ||||
| 	{ | ||||
| 		if ($this->final_output == '') | ||||
| 		{ | ||||
| 			$this->final_output = $output; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->final_output .= $output; | ||||
| 		} | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Header | ||||
| 	 * | ||||
| 	 * Lets you set a server header which will be outputted with the final display. | ||||
| 	 * | ||||
| 	 * Note:  If a file is cached, headers will not be sent.  We need to figure out | ||||
| 	 * how to permit header data to be saved with the cache data... | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param 	bool | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_header($header, $replace = TRUE) | ||||
| 	{ | ||||
| 		// If zlib.output_compression is enabled it will compress the output, | ||||
| 		// but it will not modify the content-length header to compensate for | ||||
| 		// the reduction, causing the browser to hang waiting for more data. | ||||
| 		// We'll just skip content-length in those cases. | ||||
|  | ||||
| 		if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$this->headers[] = array($header, $replace); | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Content Type Header | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	extension of the file we're outputting | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_content_type($mime_type) | ||||
| 	{ | ||||
| 		if (strpos($mime_type, '/') === FALSE) | ||||
| 		{ | ||||
| 			$extension = ltrim($mime_type, '.'); | ||||
|  | ||||
| 			// Is this extension supported? | ||||
| 			if (isset($this->mime_types[$extension])) | ||||
| 			{ | ||||
| 				$mime_type =& $this->mime_types[$extension]; | ||||
|  | ||||
| 				if (is_array($mime_type)) | ||||
| 				{ | ||||
| 					$mime_type = current($mime_type); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$header = 'Content-Type: '.$mime_type; | ||||
|  | ||||
| 		$this->headers[] = array($header, TRUE); | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set HTTP Status Header | ||||
| 	 * moved to Common procedural functions in 1.7.2 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	int		the status code | ||||
| 	 * @param	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_status_header($code = 200, $text = '') | ||||
| 	{ | ||||
| 		set_status_header($code, $text); | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Enable/disable Profiler | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	bool | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function enable_profiler($val = TRUE) | ||||
| 	{ | ||||
| 		$this->enable_profiler = (is_bool($val)) ? $val : TRUE; | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Profiler Sections | ||||
| 	 * | ||||
| 	 * Allows override of default / config settings for Profiler section display | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	array | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_profiler_sections($sections) | ||||
| 	{ | ||||
| 		foreach ($sections as $section => $enable) | ||||
| 		{ | ||||
| 			$this->_profiler_sections[$section] = ($enable !== FALSE) ? TRUE : FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Cache | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	integer | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function cache($time) | ||||
| 	{ | ||||
| 		$this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Display Output | ||||
| 	 * | ||||
| 	 * All "view" data is automatically put into this variable by the controller class: | ||||
| 	 * | ||||
| 	 * $this->final_output | ||||
| 	 * | ||||
| 	 * This function sends the finalized output data to the browser along | ||||
| 	 * with any server headers and profile data.  It also stops the | ||||
| 	 * benchmark timer so the page rendering speed and memory usage can be shown. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param 	string | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _display($output = '') | ||||
| 	{ | ||||
| 		// Note:  We use globals because we can't use $CI =& get_instance() | ||||
| 		// since this function is sometimes called by the caching mechanism, | ||||
| 		// which happens before the CI super object is available. | ||||
| 		global $BM, $CFG; | ||||
|  | ||||
| 		// Grab the super object if we can. | ||||
| 		if (class_exists('CI_Controller')) | ||||
| 		{ | ||||
| 			$CI =& get_instance(); | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Set the output data | ||||
| 		if ($output == '') | ||||
| 		{ | ||||
| 			$output =& $this->final_output; | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Do we need to write a cache file?  Only if the controller does not have its | ||||
| 		// own _output() method and we are not dealing with a cache file, which we | ||||
| 		// can determine by the existence of the $CI object above | ||||
| 		if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) | ||||
| 		{ | ||||
| 			$this->_write_cache($output); | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Parse out the elapsed time and memory usage, | ||||
| 		// then swap the pseudo-variables with the data | ||||
|  | ||||
| 		$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); | ||||
|  | ||||
| 		if ($this->parse_exec_vars === TRUE) | ||||
| 		{ | ||||
| 			$memory	 = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB'; | ||||
|  | ||||
| 			$output = str_replace('{elapsed_time}', $elapsed, $output); | ||||
| 			$output = str_replace('{memory_usage}', $memory, $output); | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Is compression requested? | ||||
| 		if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE) | ||||
| 		{ | ||||
| 			if (extension_loaded('zlib')) | ||||
| 			{ | ||||
| 				if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) | ||||
| 				{ | ||||
| 					ob_start('ob_gzhandler'); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Are there any server headers to send? | ||||
| 		if (count($this->headers) > 0) | ||||
| 		{ | ||||
| 			foreach ($this->headers as $header) | ||||
| 			{ | ||||
| 				@header($header[0], $header[1]); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Does the $CI object exist? | ||||
| 		// If not we know we are dealing with a cache file so we'll | ||||
| 		// simply echo out the data and exit. | ||||
| 		if ( ! isset($CI)) | ||||
| 		{ | ||||
| 			echo $output; | ||||
| 			log_message('debug', "Final output sent to browser"); | ||||
| 			log_message('debug', "Total execution time: ".$elapsed); | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Do we need to generate profile data? | ||||
| 		// If so, load the Profile class and run it. | ||||
| 		if ($this->enable_profiler == TRUE) | ||||
| 		{ | ||||
| 			$CI->load->library('profiler'); | ||||
|  | ||||
| 			if ( ! empty($this->_profiler_sections)) | ||||
| 			{ | ||||
| 				$CI->profiler->set_sections($this->_profiler_sections); | ||||
| 			} | ||||
|  | ||||
| 			// If the output data contains closing </body> and </html> tags | ||||
| 			// we will remove them and add them back after we insert the profile data | ||||
| 			if (preg_match("|</body>.*?</html>|is", $output)) | ||||
| 			{ | ||||
| 				$output  = preg_replace("|</body>.*?</html>|is", '', $output); | ||||
| 				$output .= $CI->profiler->run(); | ||||
| 				$output .= '</body></html>'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$output .= $CI->profiler->run(); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// -------------------------------------------------------------------- | ||||
|  | ||||
| 		// Does the controller contain a function named _output()? | ||||
| 		// If so send the output there.  Otherwise, echo it. | ||||
| 		if (method_exists($CI, '_output')) | ||||
| 		{ | ||||
| 			$CI->_output($output); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			echo $output;  // Send it to the browser! | ||||
| 		} | ||||
|  | ||||
| 		log_message('debug', "Final output sent to browser"); | ||||
| 		log_message('debug', "Total execution time: ".$elapsed); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Write a Cache File | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param 	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _write_cache($output) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		$path = $CI->config->item('cache_path'); | ||||
|  | ||||
| 		$cache_path = ($path == '') ? APPPATH.'cache/' : $path; | ||||
|  | ||||
| 		if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) | ||||
| 		{ | ||||
| 			log_message('error', "Unable to write cache file: ".$cache_path); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$uri =	$CI->config->item('base_url'). | ||||
| 				$CI->config->item('index_page'). | ||||
| 				$CI->uri->uri_string(); | ||||
|  | ||||
| 		$cache_path .= md5($uri); | ||||
|  | ||||
| 		if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE)) | ||||
| 		{ | ||||
| 			log_message('error', "Unable to write cache file: ".$cache_path); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$expire = time() + ($this->cache_expiration * 60); | ||||
|  | ||||
| 		if (flock($fp, LOCK_EX)) | ||||
| 		{ | ||||
| 			fwrite($fp, $expire.'TS--->'.$output); | ||||
| 			flock($fp, LOCK_UN); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			log_message('error', "Unable to secure a file lock for file at: ".$cache_path); | ||||
| 			return; | ||||
| 		} | ||||
| 		fclose($fp); | ||||
| 		@chmod($cache_path, FILE_WRITE_MODE); | ||||
|  | ||||
| 		log_message('debug', "Cache file written: ".$cache_path); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update/serve a cached file | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param 	object	config class | ||||
| 	 * @param 	object	uri class | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _display_cache(&$CFG, &$URI) | ||||
| 	{ | ||||
| 		$cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path'); | ||||
|  | ||||
| 		// Build the file path.  The file name is an MD5 hash of the full URI | ||||
| 		$uri =	$CFG->item('base_url'). | ||||
| 				$CFG->item('index_page'). | ||||
| 				$URI->uri_string; | ||||
|  | ||||
| 		$filepath = $cache_path.md5($uri); | ||||
|  | ||||
| 		if ( ! @file_exists($filepath)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! $fp = @fopen($filepath, FOPEN_READ)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		flock($fp, LOCK_SH); | ||||
|  | ||||
| 		$cache = ''; | ||||
| 		if (filesize($filepath) > 0) | ||||
| 		{ | ||||
| 			$cache = fread($fp, filesize($filepath)); | ||||
| 		} | ||||
|  | ||||
| 		flock($fp, LOCK_UN); | ||||
| 		fclose($fp); | ||||
|  | ||||
| 		// Strip out the embedded timestamp | ||||
| 		if ( ! preg_match("/(\d+TS--->)/", $cache, $match)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// Has the file expired? If so we'll delete it. | ||||
| 		if (time() >= trim(str_replace('TS--->', '', $match['1']))) | ||||
| 		{ | ||||
| 			if (is_really_writable($cache_path)) | ||||
| 			{ | ||||
| 				@unlink($filepath); | ||||
| 				log_message('debug', "Cache file has expired. File deleted"); | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Display the cache | ||||
| 		$this->_display(str_replace($match['0'], '', $cache)); | ||||
| 		log_message('debug', "Cache file is current. Sending it to browser."); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
| // END Output Class | ||||
|  | ||||
| /* End of file Output.php */ | ||||
| /* Location: ./system/core/Output.php */ | ||||
							
								
								
									
										522
									
								
								system/core/Router.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										522
									
								
								system/core/Router.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,522 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Router Class | ||||
|  * | ||||
|  * Parses URIs and determines routing | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @category	Libraries | ||||
|  * @link		http://codeigniter.com/user_guide/general/routing.html | ||||
|  */ | ||||
| class CI_Router { | ||||
|  | ||||
| 	/** | ||||
| 	 * Config class | ||||
| 	 * | ||||
| 	 * @var object | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $config; | ||||
| 	/** | ||||
| 	 * List of routes | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $routes			= array(); | ||||
| 	/** | ||||
| 	 * List of error routes | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $error_routes	= array(); | ||||
| 	/** | ||||
| 	 * Current class name | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $class			= ''; | ||||
| 	/** | ||||
| 	 * Current method name | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $method			= 'index'; | ||||
| 	/** | ||||
| 	 * Sub-directory that contains the requested controller class | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $directory		= ''; | ||||
| 	/** | ||||
| 	 * Default controller (and method if specific) | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $default_controller; | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Runs the route mapping function. | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		$this->config =& load_class('Config', 'core'); | ||||
| 		$this->uri =& load_class('URI', 'core'); | ||||
| 		log_message('debug', "Router Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set the route mapping | ||||
| 	 * | ||||
| 	 * This function determines what should be served based on the URI request, | ||||
| 	 * as well as any "routes" that have been set in the routing config file. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _set_routing() | ||||
| 	{ | ||||
| 		// Are query strings enabled in the config file?  Normally CI doesn't utilize query strings | ||||
| 		// since URI segments are more search-engine friendly, but they can optionally be used. | ||||
| 		// If this feature is enabled, we will gather the directory/class/method a little differently | ||||
| 		$segments = array(); | ||||
| 		if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')])) | ||||
| 		{ | ||||
| 			if (isset($_GET[$this->config->item('directory_trigger')])) | ||||
| 			{ | ||||
| 				$this->set_directory(trim($this->uri->_filter_uri($_GET[$this->config->item('directory_trigger')]))); | ||||
| 				$segments[] = $this->fetch_directory(); | ||||
| 			} | ||||
|  | ||||
| 			if (isset($_GET[$this->config->item('controller_trigger')])) | ||||
| 			{ | ||||
| 				$this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')]))); | ||||
| 				$segments[] = $this->fetch_class(); | ||||
| 			} | ||||
|  | ||||
| 			if (isset($_GET[$this->config->item('function_trigger')])) | ||||
| 			{ | ||||
| 				$this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')]))); | ||||
| 				$segments[] = $this->fetch_method(); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Load the routes.php file. | ||||
| 		if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); | ||||
| 		} | ||||
| 		elseif (is_file(APPPATH.'config/routes.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/routes.php'); | ||||
| 		} | ||||
|  | ||||
| 		$this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route; | ||||
| 		unset($route); | ||||
|  | ||||
| 		// Set the default controller so we can display it in the event | ||||
| 		// the URI doesn't correlated to a valid controller. | ||||
| 		$this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']); | ||||
|  | ||||
| 		// Were there any query string segments?  If so, we'll validate them and bail out since we're done. | ||||
| 		if (count($segments) > 0) | ||||
| 		{ | ||||
| 			return $this->_validate_request($segments); | ||||
| 		} | ||||
|  | ||||
| 		// Fetch the complete URI string | ||||
| 		$this->uri->_fetch_uri_string(); | ||||
|  | ||||
| 		// Is there a URI string? If not, the default controller specified in the "routes" file will be shown. | ||||
| 		if ($this->uri->uri_string == '') | ||||
| 		{ | ||||
| 			return $this->_set_default_controller(); | ||||
| 		} | ||||
|  | ||||
| 		// Do we need to remove the URL suffix? | ||||
| 		$this->uri->_remove_url_suffix(); | ||||
|  | ||||
| 		// Compile the segments into an array | ||||
| 		$this->uri->_explode_segments(); | ||||
|  | ||||
| 		// Parse any custom routing that may exist | ||||
| 		$this->_parse_routes(); | ||||
|  | ||||
| 		// Re-index the segment array so that it starts with 1 rather than 0 | ||||
| 		$this->uri->_reindex_segments(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set the default controller | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _set_default_controller() | ||||
| 	{ | ||||
| 		if ($this->default_controller === FALSE) | ||||
| 		{ | ||||
| 			show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file."); | ||||
| 		} | ||||
| 		// Is the method being specified? | ||||
| 		if (strpos($this->default_controller, '/') !== FALSE) | ||||
| 		{ | ||||
| 			$x = explode('/', $this->default_controller); | ||||
|  | ||||
| 			$this->set_class($x[0]); | ||||
| 			$this->set_method($x[1]); | ||||
| 			$this->_set_request($x); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->set_class($this->default_controller); | ||||
| 			$this->set_method('index'); | ||||
| 			$this->_set_request(array($this->default_controller, 'index')); | ||||
| 		} | ||||
|  | ||||
| 		// re-index the routed segments array so it starts with 1 rather than 0 | ||||
| 		$this->uri->_reindex_segments(); | ||||
|  | ||||
| 		log_message('debug', "No URI present. Default controller set."); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set the Route | ||||
| 	 * | ||||
| 	 * This function takes an array of URI segments as | ||||
| 	 * input, and sets the current class/method | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array | ||||
| 	 * @param	bool | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _set_request($segments = array()) | ||||
| 	{ | ||||
| 		$segments = $this->_validate_request($segments); | ||||
|  | ||||
| 		if (count($segments) == 0) | ||||
| 		{ | ||||
| 			return $this->_set_default_controller(); | ||||
| 		} | ||||
|  | ||||
| 		$this->set_class($segments[0]); | ||||
|  | ||||
| 		if (isset($segments[1])) | ||||
| 		{ | ||||
| 			// A standard method request | ||||
| 			$this->set_method($segments[1]); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// This lets the "routed" segment array identify that the default | ||||
| 			// index method is being used. | ||||
| 			$segments[1] = 'index'; | ||||
| 		} | ||||
|  | ||||
| 		// Update our "routed" segment array to contain the segments. | ||||
| 		// Note: If there is no custom routing, this array will be | ||||
| 		// identical to $this->uri->segments | ||||
| 		$this->uri->rsegments = $segments; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Validates the supplied segments.  Attempts to determine the path to | ||||
| 	 * the controller. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _validate_request($segments) | ||||
| 	{ | ||||
| 		if (count($segments) == 0) | ||||
| 		{ | ||||
| 			return $segments; | ||||
| 		} | ||||
|  | ||||
| 		// Does the requested controller exist in the root folder? | ||||
| 		if (file_exists(APPPATH.'controllers/'.$segments[0].'.php')) | ||||
| 		{ | ||||
| 			return $segments; | ||||
| 		} | ||||
|  | ||||
| 		// Is the controller in a sub-folder? | ||||
| 		if (is_dir(APPPATH.'controllers/'.$segments[0])) | ||||
| 		{ | ||||
| 			// Set the directory and remove it from the segment array | ||||
| 			$this->set_directory($segments[0]); | ||||
| 			$segments = array_slice($segments, 1); | ||||
|  | ||||
| 			if (count($segments) > 0) | ||||
| 			{ | ||||
| 				// Does the requested controller exist in the sub-folder? | ||||
| 				if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php')) | ||||
| 				{ | ||||
| 					if ( ! empty($this->routes['404_override'])) | ||||
| 					{ | ||||
| 						$x = explode('/', $this->routes['404_override']); | ||||
|  | ||||
| 						$this->set_directory(''); | ||||
| 						$this->set_class($x[0]); | ||||
| 						$this->set_method(isset($x[1]) ? $x[1] : 'index'); | ||||
|  | ||||
| 						return $x; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						show_404($this->fetch_directory().$segments[0]); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				// Is the method being specified in the route? | ||||
| 				if (strpos($this->default_controller, '/') !== FALSE) | ||||
| 				{ | ||||
| 					$x = explode('/', $this->default_controller); | ||||
|  | ||||
| 					$this->set_class($x[0]); | ||||
| 					$this->set_method($x[1]); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$this->set_class($this->default_controller); | ||||
| 					$this->set_method('index'); | ||||
| 				} | ||||
|  | ||||
| 				// Does the default controller exist in the sub-folder? | ||||
| 				if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php')) | ||||
| 				{ | ||||
| 					$this->directory = ''; | ||||
| 					return array(); | ||||
| 				} | ||||
|  | ||||
| 			} | ||||
|  | ||||
| 			return $segments; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		// If we've gotten this far it means that the URI does not correlate to a valid | ||||
| 		// controller class.  We will now see if there is an override | ||||
| 		if ( ! empty($this->routes['404_override'])) | ||||
| 		{ | ||||
| 			$x = explode('/', $this->routes['404_override']); | ||||
|  | ||||
| 			$this->set_class($x[0]); | ||||
| 			$this->set_method(isset($x[1]) ? $x[1] : 'index'); | ||||
|  | ||||
| 			return $x; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		// Nothing else to do at this point but show a 404 | ||||
| 		show_404($segments[0]); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 *  Parse Routes | ||||
| 	 * | ||||
| 	 * This function matches any routes that may exist in | ||||
| 	 * the config/routes.php file against the URI to | ||||
| 	 * determine if the class/method need to be remapped. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _parse_routes() | ||||
| 	{ | ||||
| 		// Turn the segment array into a URI string | ||||
| 		$uri = implode('/', $this->uri->segments); | ||||
|  | ||||
| 		// Is there a literal match?  If so we're done | ||||
| 		if (isset($this->routes[$uri])) | ||||
| 		{ | ||||
| 			return $this->_set_request(explode('/', $this->routes[$uri])); | ||||
| 		} | ||||
|  | ||||
| 		// Loop through the route array looking for wild-cards | ||||
| 		foreach ($this->routes as $key => $val) | ||||
| 		{ | ||||
| 			// Convert wild-cards to RegEx | ||||
| 			$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key)); | ||||
|  | ||||
| 			// Does the RegEx match? | ||||
| 			if (preg_match('#^'.$key.'$#', $uri)) | ||||
| 			{ | ||||
| 				// Do we have a back-reference? | ||||
| 				if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE) | ||||
| 				{ | ||||
| 					$val = preg_replace('#^'.$key.'$#', $val, $uri); | ||||
| 				} | ||||
|  | ||||
| 				return $this->_set_request(explode('/', $val)); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// If we got this far it means we didn't encounter a | ||||
| 		// matching route so we'll set the site default route | ||||
| 		$this->_set_request($this->uri->segments); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set the class name | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_class($class) | ||||
| 	{ | ||||
| 		$this->class = str_replace(array('/', '.'), '', $class); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch the current class | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function fetch_class() | ||||
| 	{ | ||||
| 		return $this->class; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 *  Set the method name | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_method($method) | ||||
| 	{ | ||||
| 		$this->method = $method; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 *  Fetch the current method | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function fetch_method() | ||||
| 	{ | ||||
| 		if ($this->method == $this->fetch_class()) | ||||
| 		{ | ||||
| 			return 'index'; | ||||
| 		} | ||||
|  | ||||
| 		return $this->method; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 *  Set the directory name | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function set_directory($dir) | ||||
| 	{ | ||||
| 		$this->directory = str_replace(array('/', '.'), '', $dir).'/'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 *  Fetch the sub-directory (if any) that contains the requested controller class | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function fetch_directory() | ||||
| 	{ | ||||
| 		return $this->directory; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 *  Set the controller overrides | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	array | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function _set_overrides($routing) | ||||
| 	{ | ||||
| 		if ( ! is_array($routing)) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($routing['directory'])) | ||||
| 		{ | ||||
| 			$this->set_directory($routing['directory']); | ||||
| 		} | ||||
|  | ||||
| 		if (isset($routing['controller']) AND $routing['controller'] != '') | ||||
| 		{ | ||||
| 			$this->set_class($routing['controller']); | ||||
| 		} | ||||
|  | ||||
| 		if (isset($routing['function'])) | ||||
| 		{ | ||||
| 			$routing['function'] = ($routing['function'] == '') ? 'index' : $routing['function']; | ||||
| 			$this->set_method($routing['function']); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
| // END Router Class | ||||
|  | ||||
| /* End of file Router.php */ | ||||
| /* Location: ./system/core/Router.php */ | ||||
							
								
								
									
										876
									
								
								system/core/Security.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										876
									
								
								system/core/Security.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,876 @@ | ||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Security Class | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	Security | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/security.html | ||||
|  */ | ||||
| class CI_Security { | ||||
|  | ||||
| 	/** | ||||
| 	 * Random Hash for protecting URLs | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_xss_hash			= ''; | ||||
| 	/** | ||||
| 	 * Random Hash for Cross Site Request Forgery Protection Cookie | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_csrf_hash			= ''; | ||||
| 	/** | ||||
| 	 * Expiration time for Cross Site Request Forgery Protection Cookie | ||||
| 	 * Defaults to two hours (in seconds) | ||||
| 	 * | ||||
| 	 * @var int | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_csrf_expire			= 7200; | ||||
| 	/** | ||||
| 	 * Token name for Cross Site Request Forgery Protection Cookie | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_csrf_token_name		= 'ci_csrf_token'; | ||||
| 	/** | ||||
| 	 * Cookie name for Cross Site Request Forgery Protection Cookie | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_csrf_cookie_name	= 'ci_csrf_token'; | ||||
| 	/** | ||||
| 	 * List of never allowed strings | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_never_allowed_str = array( | ||||
| 		'document.cookie'	=> '[removed]', | ||||
| 		'document.write'	=> '[removed]', | ||||
| 		'.parentNode'		=> '[removed]', | ||||
| 		'.innerHTML'		=> '[removed]', | ||||
| 		'window.location'	=> '[removed]', | ||||
| 		'-moz-binding'		=> '[removed]', | ||||
| 		'<!--'				=> '<!--', | ||||
| 		'-->'				=> '-->', | ||||
| 		'<![CDATA['			=> '<![CDATA[', | ||||
| 		'<comment>'			=> '<comment>' | ||||
| 	); | ||||
|  | ||||
| 	/* never allowed, regex replacement */ | ||||
| 	/** | ||||
| 	 * List of never allowed regex replacement | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access protected | ||||
| 	 */ | ||||
| 	protected $_never_allowed_regex = array( | ||||
| 		'javascript\s*:', | ||||
| 		'expression\s*(\(|&\#40;)', // CSS and IE | ||||
| 		'vbscript\s*:', // IE, surprise! | ||||
| 		'Redirect\s+302', | ||||
| 		"([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function __construct() | ||||
| 	{ | ||||
| 		// Is CSRF protection enabled? | ||||
| 		if (config_item('csrf_protection') === TRUE) | ||||
| 		{ | ||||
| 			// CSRF config | ||||
| 			foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) | ||||
| 			{ | ||||
| 				if (FALSE !== ($val = config_item($key))) | ||||
| 				{ | ||||
| 					$this->{'_'.$key} = $val; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// Append application specific cookie prefix | ||||
| 			if (config_item('cookie_prefix')) | ||||
| 			{ | ||||
| 				$this->_csrf_cookie_name = config_item('cookie_prefix').$this->_csrf_cookie_name; | ||||
| 			} | ||||
|  | ||||
| 			// Set the CSRF hash | ||||
| 			$this->_csrf_set_hash(); | ||||
| 		} | ||||
|  | ||||
| 		log_message('debug', "Security Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Verify Cross Site Request Forgery Protection | ||||
| 	 * | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function csrf_verify() | ||||
| 	{ | ||||
| 		// If it's not a POST request we will set the CSRF cookie | ||||
| 		if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') | ||||
| 		{ | ||||
| 			return $this->csrf_set_cookie(); | ||||
| 		} | ||||
|  | ||||
| 		// Do the tokens exist in both the _POST and _COOKIE arrays? | ||||
| 		if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name])) | ||||
| 		{ | ||||
| 			$this->csrf_show_error(); | ||||
| 		} | ||||
|  | ||||
| 		// Do the tokens match? | ||||
| 		if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name]) | ||||
| 		{ | ||||
| 			$this->csrf_show_error(); | ||||
| 		} | ||||
|  | ||||
| 		// We kill this since we're done and we don't want to | ||||
| 		// polute the _POST array | ||||
| 		unset($_POST[$this->_csrf_token_name]); | ||||
|  | ||||
| 		// Nothing should last forever | ||||
| 		unset($_COOKIE[$this->_csrf_cookie_name]); | ||||
| 		$this->_csrf_set_hash(); | ||||
| 		$this->csrf_set_cookie(); | ||||
|  | ||||
| 		log_message('debug', 'CSRF token verified'); | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Cross Site Request Forgery Protection Cookie | ||||
| 	 * | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function csrf_set_cookie() | ||||
| 	{ | ||||
| 		$expire = time() + $this->_csrf_expire; | ||||
| 		$secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0; | ||||
|  | ||||
| 		if ($secure_cookie && (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off')) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie); | ||||
|  | ||||
| 		log_message('debug', "CRSF cookie Set"); | ||||
|  | ||||
| 		return $this; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show CSRF Error | ||||
| 	 * | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function csrf_show_error() | ||||
| 	{ | ||||
| 		show_error('The action you have requested is not allowed.'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Get CSRF Hash | ||||
| 	 * | ||||
| 	 * Getter Method | ||||
| 	 * | ||||
| 	 * @return 	string 	self::_csrf_hash | ||||
| 	 */ | ||||
| 	public function get_csrf_hash() | ||||
| 	{ | ||||
| 		return $this->_csrf_hash; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Get CSRF Token Name | ||||
| 	 * | ||||
| 	 * Getter Method | ||||
| 	 * | ||||
| 	 * @return 	string 	self::csrf_token_name | ||||
| 	 */ | ||||
| 	public function get_csrf_token_name() | ||||
| 	{ | ||||
| 		return $this->_csrf_token_name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * XSS Clean | ||||
| 	 * | ||||
| 	 * Sanitizes data so that Cross Site Scripting Hacks can be | ||||
| 	 * prevented.  This function does a fair amount of work but | ||||
| 	 * it is extremely thorough, designed to prevent even the | ||||
| 	 * most obscure XSS attempts.  Nothing is ever 100% foolproof, | ||||
| 	 * of course, but I haven't been able to get anything passed | ||||
| 	 * the filter. | ||||
| 	 * | ||||
| 	 * Note: This function should only be used to deal with data | ||||
| 	 * upon submission.  It's not something that should | ||||
| 	 * be used for general runtime processing. | ||||
| 	 * | ||||
| 	 * This function was based in part on some code and ideas I | ||||
| 	 * got from Bitflux: http://channel.bitflux.ch/wiki/XSS_Prevention | ||||
| 	 * | ||||
| 	 * To help develop this script I used this great list of | ||||
| 	 * vulnerabilities along with a few other hacks I've | ||||
| 	 * harvested from examining vulnerabilities in other programs: | ||||
| 	 * http://ha.ckers.org/xss.html | ||||
| 	 * | ||||
| 	 * @param	mixed	string or array | ||||
| 	 * @param 	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	public function xss_clean($str, $is_image = FALSE) | ||||
| 	{ | ||||
| 		/* | ||||
| 		 * Is the string an array? | ||||
| 		 * | ||||
| 		 */ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			while (list($key) = each($str)) | ||||
| 			{ | ||||
| 				$str[$key] = $this->xss_clean($str[$key]); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		/* | ||||
| 		 * Remove Invisible Characters | ||||
| 		 */ | ||||
| 		$str = remove_invisible_characters($str); | ||||
|  | ||||
| 		// Validate Entities in URLs | ||||
| 		$str = $this->_validate_entities($str); | ||||
|  | ||||
| 		/* | ||||
| 		 * URL Decode | ||||
| 		 * | ||||
| 		 * Just in case stuff like this is submitted: | ||||
| 		 * | ||||
| 		 * <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a> | ||||
| 		 * | ||||
| 		 * Note: Use rawurldecode() so it does not remove plus signs | ||||
| 		 * | ||||
| 		 */ | ||||
| 		$str = rawurldecode($str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Convert character entities to ASCII | ||||
| 		 * | ||||
| 		 * This permits our tests below to work reliably. | ||||
| 		 * We only convert entities that are within tags since | ||||
| 		 * these are the ones that will pose security problems. | ||||
| 		 * | ||||
| 		 */ | ||||
|  | ||||
| 		$str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); | ||||
|  | ||||
| 		$str = preg_replace_callback("/<\w+.*?(?=>|<|$)/si", array($this, '_decode_entity'), $str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Remove Invisible Characters Again! | ||||
| 		 */ | ||||
| 		$str = remove_invisible_characters($str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Convert all tabs to spaces | ||||
| 		 * | ||||
| 		 * This prevents strings like this: ja	vascript | ||||
| 		 * NOTE: we deal with spaces between characters later. | ||||
| 		 * NOTE: preg_replace was found to be amazingly slow here on | ||||
| 		 * large blocks of data, so we use str_replace. | ||||
| 		 */ | ||||
|  | ||||
| 		if (strpos($str, "\t") !== FALSE) | ||||
| 		{ | ||||
| 			$str = str_replace("\t", ' ', $str); | ||||
| 		} | ||||
|  | ||||
| 		/* | ||||
| 		 * Capture converted string for later comparison | ||||
| 		 */ | ||||
| 		$converted_string = $str; | ||||
|  | ||||
| 		// Remove Strings that are never allowed | ||||
| 		$str = $this->_do_never_allowed($str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Makes PHP tags safe | ||||
| 		 * | ||||
| 		 * Note: XML tags are inadvertently replaced too: | ||||
| 		 * | ||||
| 		 * <?xml | ||||
| 		 * | ||||
| 		 * But it doesn't seem to pose a problem. | ||||
| 		 */ | ||||
| 		if ($is_image === TRUE) | ||||
| 		{ | ||||
| 			// Images have a tendency to have the PHP short opening and | ||||
| 			// closing tags every so often so we skip those and only | ||||
| 			// do the long opening tags. | ||||
| 			$str = preg_replace('/<\?(php)/i', "<?\\1", $str); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = str_replace(array('<?', '?'.'>'),  array('<?', '?>'), $str); | ||||
| 		} | ||||
|  | ||||
| 		/* | ||||
| 		 * Compact any exploded words | ||||
| 		 * | ||||
| 		 * This corrects words like:  j a v a s c r i p t | ||||
| 		 * These words are compacted back to their correct state. | ||||
| 		 */ | ||||
| 		$words = array( | ||||
| 			'javascript', 'expression', 'vbscript', 'script', 'base64', | ||||
| 			'applet', 'alert', 'document', 'write', 'cookie', 'window' | ||||
| 		); | ||||
|  | ||||
| 		foreach ($words as $word) | ||||
| 		{ | ||||
| 			$temp = ''; | ||||
|  | ||||
| 			for ($i = 0, $wordlen = strlen($word); $i < $wordlen; $i++) | ||||
| 			{ | ||||
| 				$temp .= substr($word, $i, 1)."\s*"; | ||||
| 			} | ||||
|  | ||||
| 			// We only want to do this when it is followed by a non-word character | ||||
| 			// That way valid stuff like "dealer to" does not become "dealerto" | ||||
| 			$str = preg_replace_callback('#('.substr($temp, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); | ||||
| 		} | ||||
|  | ||||
| 		/* | ||||
| 		 * Remove disallowed Javascript in links or img tags | ||||
| 		 * We used to do some version comparisons and use of stripos for PHP5, | ||||
| 		 * but it is dog slow compared to these simplified non-capturing | ||||
| 		 * preg_match(), especially if the pattern exists in the string | ||||
| 		 */ | ||||
| 		do | ||||
| 		{ | ||||
| 			$original = $str; | ||||
|  | ||||
| 			if (preg_match("/<a/i", $str)) | ||||
| 			{ | ||||
| 				$str = preg_replace_callback("#<a\s+([^>]*?)(>|$)#si", array($this, '_js_link_removal'), $str); | ||||
| 			} | ||||
|  | ||||
| 			if (preg_match("/<img/i", $str)) | ||||
| 			{ | ||||
| 				$str = preg_replace_callback("#<img\s+([^>]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str); | ||||
| 			} | ||||
|  | ||||
| 			if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str)) | ||||
| 			{ | ||||
| 				$str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str); | ||||
| 			} | ||||
| 		} | ||||
| 		while($original != $str); | ||||
|  | ||||
| 		unset($original); | ||||
|  | ||||
| 		// Remove evil attributes such as style, onclick and xmlns | ||||
| 		$str = $this->_remove_evil_attributes($str, $is_image); | ||||
|  | ||||
| 		/* | ||||
| 		 * Sanitize naughty HTML elements | ||||
| 		 * | ||||
| 		 * If a tag containing any of the words in the list | ||||
| 		 * below is found, the tag gets converted to entities. | ||||
| 		 * | ||||
| 		 * So this: <blink> | ||||
| 		 * Becomes: <blink> | ||||
| 		 */ | ||||
| 		$naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta|object|plaintext|style|script|textarea|title|video|xml|xss'; | ||||
| 		$str = preg_replace_callback('#<(/*\s*)('.$naughty.')([^><]*)([><]*)#is', array($this, '_sanitize_naughty_html'), $str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Sanitize naughty scripting elements | ||||
| 		 * | ||||
| 		 * Similar to above, only instead of looking for | ||||
| 		 * tags it looks for PHP and JavaScript commands | ||||
| 		 * that are disallowed.  Rather than removing the | ||||
| 		 * code, it simply converts the parenthesis to entities | ||||
| 		 * rendering the code un-executable. | ||||
| 		 * | ||||
| 		 * For example:	eval('some code') | ||||
| 		 * Becomes:		eval('some code') | ||||
| 		 */ | ||||
| 		$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str); | ||||
|  | ||||
|  | ||||
| 		// Final clean up | ||||
| 		// This adds a bit of extra precaution in case | ||||
| 		// something got through the above filters | ||||
| 		$str = $this->_do_never_allowed($str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Images are Handled in a Special Way | ||||
| 		 * - Essentially, we want to know that after all of the character | ||||
| 		 * conversion is done whether any unwanted, likely XSS, code was found. | ||||
| 		 * If not, we return TRUE, as the image is clean. | ||||
| 		 * However, if the string post-conversion does not matched the | ||||
| 		 * string post-removal of XSS, then it fails, as there was unwanted XSS | ||||
| 		 * code found and removed/changed during processing. | ||||
| 		 */ | ||||
|  | ||||
| 		if ($is_image === TRUE) | ||||
| 		{ | ||||
| 			return ($str == $converted_string) ? TRUE: FALSE; | ||||
| 		} | ||||
|  | ||||
| 		log_message('debug', "XSS Filtering completed"); | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Random Hash for protecting URLs | ||||
| 	 * | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	public function xss_hash() | ||||
| 	{ | ||||
| 		if ($this->_xss_hash == '') | ||||
| 		{ | ||||
| 			mt_srand(); | ||||
| 			$this->_xss_hash = md5(time() + mt_rand(0, 1999999999)); | ||||
| 		} | ||||
|  | ||||
| 		return $this->_xss_hash; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * HTML Entities Decode | ||||
| 	 * | ||||
| 	 * This function is a replacement for html_entity_decode() | ||||
| 	 * | ||||
| 	 * The reason we are not using html_entity_decode() by itself is because | ||||
| 	 * while it is not technically correct to leave out the semicolon | ||||
| 	 * at the end of an entity most browsers will still interpret the entity | ||||
| 	 * correctly.  html_entity_decode() does not convert entities without | ||||
| 	 * semicolons, so we are left with our own little solution here. Bummer. | ||||
| 	 * | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	public function entity_decode($str, $charset='UTF-8') | ||||
| 	{ | ||||
| 		if (stristr($str, '&') === FALSE) | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$str = html_entity_decode($str, ENT_COMPAT, $charset); | ||||
| 		$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str); | ||||
| 		return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Filename Security | ||||
| 	 * | ||||
| 	 * @param	string | ||||
| 	 * @param 	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	public function sanitize_filename($str, $relative_path = FALSE) | ||||
| 	{ | ||||
| 		$bad = array( | ||||
| 			"../", | ||||
| 			"<!--", | ||||
| 			"-->", | ||||
| 			"<", | ||||
| 			">", | ||||
| 			"'", | ||||
| 			'"', | ||||
| 			'&', | ||||
| 			'$', | ||||
| 			'#', | ||||
| 			'{', | ||||
| 			'}', | ||||
| 			'[', | ||||
| 			']', | ||||
| 			'=', | ||||
| 			';', | ||||
| 			'?', | ||||
| 			"%20", | ||||
| 			"%22", | ||||
| 			"%3c",		// < | ||||
| 			"%253c",	// < | ||||
| 			"%3e",		// > | ||||
| 			"%0e",		// > | ||||
| 			"%28",		// ( | ||||
| 			"%29",		// ) | ||||
| 			"%2528",	// ( | ||||
| 			"%26",		// & | ||||
| 			"%24",		// $ | ||||
| 			"%3f",		// ? | ||||
| 			"%3b",		// ; | ||||
| 			"%3d"		// = | ||||
| 		); | ||||
|  | ||||
| 		if ( ! $relative_path) | ||||
| 		{ | ||||
| 			$bad[] = './'; | ||||
| 			$bad[] = '/'; | ||||
| 		} | ||||
|  | ||||
| 		$str = remove_invisible_characters($str, FALSE); | ||||
| 		return stripslashes(str_replace($bad, '', $str)); | ||||
| 	} | ||||
|  | ||||
| 	// ---------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Compact Exploded Words | ||||
| 	 * | ||||
| 	 * Callback function for xss_clean() to remove whitespace from | ||||
| 	 * things like j a v a s c r i p t | ||||
| 	 * | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	protected function _compact_exploded_words($matches) | ||||
| 	{ | ||||
| 		return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/* | ||||
| 	 * Remove Evil HTML Attributes (like evenhandlers and style) | ||||
| 	 * | ||||
| 	 * It removes the evil attribute and either: | ||||
| 	 * 	- Everything up until a space | ||||
| 	 *		For example, everything between the pipes: | ||||
| 	 *		<a |style=document.write('hello');alert('world');| class=link> | ||||
| 	 * 	- Everything inside the quotes | ||||
| 	 *		For example, everything between the pipes: | ||||
| 	 *		<a |style="document.write('hello'); alert('world');"| class="link"> | ||||
| 	 * | ||||
| 	 * @param string $str The string to check | ||||
| 	 * @param boolean $is_image TRUE if this is an image | ||||
| 	 * @return string The string with the evil attributes removed | ||||
| 	 */ | ||||
| 	protected function _remove_evil_attributes($str, $is_image) | ||||
| 	{ | ||||
| 		// All javascript event handlers (e.g. onload, onclick, onmouseover), style, and xmlns | ||||
| 		$evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction'); | ||||
|  | ||||
| 		if ($is_image === TRUE) | ||||
| 		{ | ||||
| 			/* | ||||
| 			 * Adobe Photoshop puts XML metadata into JFIF images,  | ||||
| 			 * including namespacing, so we have to allow this for images. | ||||
| 			 */ | ||||
| 			unset($evil_attributes[array_search('xmlns', $evil_attributes)]); | ||||
| 		} | ||||
|  | ||||
| 		do { | ||||
| 			$count = 0; | ||||
| 			$attribs = array(); | ||||
|  | ||||
| 			// find occurrences of illegal attribute strings without quotes | ||||
| 			preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*([^\s>]*)/is', $str, $matches, PREG_SET_ORDER); | ||||
|  | ||||
| 			foreach ($matches as $attr) | ||||
| 			{ | ||||
|  | ||||
| 				$attribs[] = preg_quote($attr[0], '/'); | ||||
| 			} | ||||
|  | ||||
| 			// find occurrences of illegal attribute strings with quotes (042 and 047 are octal quotes) | ||||
| 			preg_match_all("/(".implode('|', $evil_attributes).")\s*=\s*(\042|\047)([^\\2]*?)(\\2)/is",  $str, $matches, PREG_SET_ORDER); | ||||
|  | ||||
| 			foreach ($matches as $attr) | ||||
| 			{ | ||||
| 				$attribs[] = preg_quote($attr[0], '/'); | ||||
| 			} | ||||
|  | ||||
| 			// replace illegal attribute strings that are inside an html tag | ||||
| 			if (count($attribs) > 0) | ||||
| 			{ | ||||
| 				$str = preg_replace("/<(\/?[^><]+?)([^A-Za-z<>\-])(.*?)(".implode('|', $attribs).")(.*?)([\s><])([><]*)/i", '<$1 $3$5$6$7', $str, -1, $count); | ||||
| 			} | ||||
|  | ||||
| 		} while ($count); | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Sanitize Naughty HTML | ||||
| 	 * | ||||
| 	 * Callback function for xss_clean() to remove naughty HTML elements | ||||
| 	 * | ||||
| 	 * @param	array | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _sanitize_naughty_html($matches) | ||||
| 	{ | ||||
| 		// encode opening brace | ||||
| 		$str = '<'.$matches[1].$matches[2].$matches[3]; | ||||
|  | ||||
| 		// encode captured opening or closing brace to prevent recursive vectors | ||||
| 		$str .= str_replace(array('>', '<'), array('>', '<'), | ||||
| 							$matches[4]); | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * JS Link Removal | ||||
| 	 * | ||||
| 	 * Callback function for xss_clean() to sanitize links | ||||
| 	 * This limits the PCRE backtracks, making it more performance friendly | ||||
| 	 * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in | ||||
| 	 * PHP 5.2+ on link-heavy strings | ||||
| 	 * | ||||
| 	 * @param	array | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _js_link_removal($match) | ||||
| 	{ | ||||
| 		return str_replace( | ||||
| 			$match[1], | ||||
| 			preg_replace( | ||||
| 				'#href=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|<script|<xss|data\s*:)#si', | ||||
| 				'', | ||||
| 				$this->_filter_attributes(str_replace(array('<', '>'), '', $match[1])) | ||||
| 			), | ||||
| 			$match[0] | ||||
| 		); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * JS Image Removal | ||||
| 	 * | ||||
| 	 * Callback function for xss_clean() to sanitize image tags | ||||
| 	 * This limits the PCRE backtracks, making it more performance friendly | ||||
| 	 * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in | ||||
| 	 * PHP 5.2+ on image tag heavy strings | ||||
| 	 * | ||||
| 	 * @param	array | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _js_img_removal($match) | ||||
| 	{ | ||||
| 		return str_replace( | ||||
| 			$match[1], | ||||
| 			preg_replace( | ||||
| 				'#src=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si', | ||||
| 				'', | ||||
| 				$this->_filter_attributes(str_replace(array('<', '>'), '', $match[1])) | ||||
| 			), | ||||
| 			$match[0] | ||||
| 		); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Attribute Conversion | ||||
| 	 * | ||||
| 	 * Used as a callback for XSS Clean | ||||
| 	 * | ||||
| 	 * @param	array | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _convert_attribute($match) | ||||
| 	{ | ||||
| 		return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Filter Attributes | ||||
| 	 * | ||||
| 	 * Filters tag attributes for consistency and safety | ||||
| 	 * | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _filter_attributes($str) | ||||
| 	{ | ||||
| 		$out = ''; | ||||
|  | ||||
| 		if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) | ||||
| 		{ | ||||
| 			foreach ($matches[0] as $match) | ||||
| 			{ | ||||
| 				$out .= preg_replace("#/\*.*?\*/#s", '', $match); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $out; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * HTML Entity Decode Callback | ||||
| 	 * | ||||
| 	 * Used as a callback for XSS Clean | ||||
| 	 * | ||||
| 	 * @param	array | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _decode_entity($match) | ||||
| 	{ | ||||
| 		return $this->entity_decode($match[0], strtoupper(config_item('charset'))); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Validate URL entities | ||||
| 	 * | ||||
| 	 * Called by xss_clean() | ||||
| 	 * | ||||
| 	 * @param 	string | ||||
| 	 * @return 	string | ||||
| 	 */ | ||||
| 	protected function _validate_entities($str) | ||||
| 	{ | ||||
| 		/* | ||||
| 		 * Protect GET variables in URLs | ||||
| 		 */ | ||||
|  | ||||
| 		 // 901119URL5918AMP18930PROTECT8198 | ||||
|  | ||||
| 		$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash()."\\1=\\2", $str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Validate standard character entities | ||||
| 		 * | ||||
| 		 * Add a semicolon if missing.  We do this to enable | ||||
| 		 * the conversion of entities to ASCII later. | ||||
| 		 * | ||||
| 		 */ | ||||
| 		$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Validate UTF16 two byte encoding (x00) | ||||
| 		 * | ||||
| 		 * Just as above, adds a semicolon if missing. | ||||
| 		 * | ||||
| 		 */ | ||||
| 		$str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str); | ||||
|  | ||||
| 		/* | ||||
| 		 * Un-Protect GET variables in URLs | ||||
| 		 */ | ||||
| 		$str = str_replace($this->xss_hash(), '&', $str); | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// ---------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Do Never Allowed | ||||
| 	 * | ||||
| 	 * A utility function for xss_clean() | ||||
| 	 * | ||||
| 	 * @param 	string | ||||
| 	 * @return 	string | ||||
| 	 */ | ||||
| 	protected function _do_never_allowed($str) | ||||
| 	{ | ||||
| 		$str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); | ||||
|  | ||||
| 		foreach ($this->_never_allowed_regex as $regex) | ||||
| 		{ | ||||
| 			$str = preg_replace('#'.$regex.'#is', '[removed]', $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Cross Site Request Forgery Protection Cookie | ||||
| 	 * | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _csrf_set_hash() | ||||
| 	{ | ||||
| 		if ($this->_csrf_hash == '') | ||||
| 		{ | ||||
| 			// If the cookie exists we will use it's value. | ||||
| 			// We don't necessarily want to regenerate it with | ||||
| 			// each page load since a page could contain embedded | ||||
| 			// sub-pages causing this feature to fail | ||||
| 			if (isset($_COOKIE[$this->_csrf_cookie_name]) && | ||||
| 				preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) | ||||
| 			{ | ||||
| 				return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; | ||||
| 			} | ||||
|  | ||||
| 			return $this->_csrf_hash = md5(uniqid(rand(), TRUE)); | ||||
| 		} | ||||
|  | ||||
| 		return $this->_csrf_hash; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file Security.php */ | ||||
| /* Location: ./system/libraries/Security.php */ | ||||
							
								
								
									
										654
									
								
								system/core/URI.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										654
									
								
								system/core/URI.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,654 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * URI Class | ||||
|  * | ||||
|  * Parses URIs and determines routing | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	URI | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/uri.html | ||||
|  */ | ||||
| class CI_URI { | ||||
|  | ||||
| 	/** | ||||
| 	 * List of cached uri segments | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var	$keyval			= array(); | ||||
| 	/** | ||||
| 	 * Current uri string | ||||
| 	 * | ||||
| 	 * @var string | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $uri_string; | ||||
| 	/** | ||||
| 	 * List of uri segments | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $segments		= array(); | ||||
| 	/** | ||||
| 	 * Re-indexed list of uri segments | ||||
| 	 * Starts at 1 instead of 0 | ||||
| 	 * | ||||
| 	 * @var array | ||||
| 	 * @access public | ||||
| 	 */ | ||||
| 	var $rsegments		= array(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Simply globalizes the $RTR object.  The front | ||||
| 	 * loads the Router class early on so it's not available | ||||
| 	 * normally as other classes are. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		$this->config =& load_class('Config', 'core'); | ||||
| 		log_message('debug', "URI Class Initialized"); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Get the URI String | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _fetch_uri_string() | ||||
| 	{ | ||||
| 		if (strtoupper($this->config->item('uri_protocol')) == 'AUTO') | ||||
| 		{ | ||||
| 			// Is the request coming from the command line? | ||||
| 			if (php_sapi_name() == 'cli' or defined('STDIN')) | ||||
| 			{ | ||||
| 				$this->_set_uri_string($this->_parse_cli_args()); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			// Let's try the REQUEST_URI first, this will work in most situations | ||||
| 			if ($uri = $this->_detect_uri()) | ||||
| 			{ | ||||
| 				$this->_set_uri_string($uri); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			// Is there a PATH_INFO variable? | ||||
| 			// Note: some servers seem to have trouble with getenv() so we'll test it two ways | ||||
| 			$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO'); | ||||
| 			if (trim($path, '/') != '' && $path != "/".SELF) | ||||
| 			{ | ||||
| 				$this->_set_uri_string($path); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			// No PATH_INFO?... What about QUERY_STRING? | ||||
| 			$path =  (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); | ||||
| 			if (trim($path, '/') != '') | ||||
| 			{ | ||||
| 				$this->_set_uri_string($path); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			// As a last ditch effort lets try using the $_GET array | ||||
| 			if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '') | ||||
| 			{ | ||||
| 				$this->_set_uri_string(key($_GET)); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			// We've exhausted all our options... | ||||
| 			$this->uri_string = ''; | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$uri = strtoupper($this->config->item('uri_protocol')); | ||||
|  | ||||
| 		if ($uri == 'REQUEST_URI') | ||||
| 		{ | ||||
| 			$this->_set_uri_string($this->_detect_uri()); | ||||
| 			return; | ||||
| 		} | ||||
| 		elseif ($uri == 'CLI') | ||||
| 		{ | ||||
| 			$this->_set_uri_string($this->_parse_cli_args()); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$path = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri); | ||||
| 		$this->_set_uri_string($path); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set the URI String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param 	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _set_uri_string($str) | ||||
| 	{ | ||||
| 		// Filter out control characters | ||||
| 		$str = remove_invisible_characters($str, FALSE); | ||||
|  | ||||
| 		// If the URI contains only a slash we'll kill it | ||||
| 		$this->uri_string = ($str == '/') ? '' : $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Detects the URI | ||||
| 	 * | ||||
| 	 * This function will detect the URI automatically and fix the query string | ||||
| 	 * if necessary. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	private function _detect_uri() | ||||
| 	{ | ||||
| 		if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME'])) | ||||
| 		{ | ||||
| 			return ''; | ||||
| 		} | ||||
|  | ||||
| 		$uri = $_SERVER['REQUEST_URI']; | ||||
| 		if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) | ||||
| 		{ | ||||
| 			$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); | ||||
| 		} | ||||
| 		elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) | ||||
| 		{ | ||||
| 			$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); | ||||
| 		} | ||||
|  | ||||
| 		// This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct | ||||
| 		// URI is found, and also fixes the QUERY_STRING server var and $_GET array. | ||||
| 		if (strncmp($uri, '?/', 2) === 0) | ||||
| 		{ | ||||
| 			$uri = substr($uri, 2); | ||||
| 		} | ||||
| 		$parts = preg_split('#\?#i', $uri, 2); | ||||
| 		$uri = $parts[0]; | ||||
| 		if (isset($parts[1])) | ||||
| 		{ | ||||
| 			$_SERVER['QUERY_STRING'] = $parts[1]; | ||||
| 			parse_str($_SERVER['QUERY_STRING'], $_GET); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$_SERVER['QUERY_STRING'] = ''; | ||||
| 			$_GET = array(); | ||||
| 		} | ||||
|  | ||||
| 		if ($uri == '/' || empty($uri)) | ||||
| 		{ | ||||
| 			return '/'; | ||||
| 		} | ||||
|  | ||||
| 		$uri = parse_url($uri, PHP_URL_PATH); | ||||
|  | ||||
| 		// Do some final cleaning of the URI and return it | ||||
| 		return str_replace(array('//', '../'), '/', trim($uri, '/')); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Parse cli arguments | ||||
| 	 * | ||||
| 	 * Take each command line argument and assume it is a URI segment. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	private function _parse_cli_args() | ||||
| 	{ | ||||
| 		$args = array_slice($_SERVER['argv'], 1); | ||||
|  | ||||
| 		return $args ? '/' . implode('/', $args) : ''; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Filter segments for malicious characters | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _filter_uri($str) | ||||
| 	{ | ||||
| 		if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE) | ||||
| 		{ | ||||
| 			// preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards | ||||
| 			// compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern | ||||
| 			if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str)) | ||||
| 			{ | ||||
| 				show_error('The URI you submitted has disallowed characters.', 400); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Convert programatic characters to entities | ||||
| 		$bad	= array('$',		'(',		')',		'%28',		'%29'); | ||||
| 		$good	= array('$',	'(',	')',	'(',	')'); | ||||
|  | ||||
| 		return str_replace($bad, $good, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Remove the suffix from the URL if needed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _remove_url_suffix() | ||||
| 	{ | ||||
| 		if  ($this->config->item('url_suffix') != "") | ||||
| 		{ | ||||
| 			$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Explode the URI Segments. The individual segments will | ||||
| 	 * be stored in the $this->segments array. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _explode_segments() | ||||
| 	{ | ||||
| 		foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val) | ||||
| 		{ | ||||
| 			// Filter segments for security | ||||
| 			$val = trim($this->_filter_uri($val)); | ||||
|  | ||||
| 			if ($val != '') | ||||
| 			{ | ||||
| 				$this->segments[] = $val; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
| 	/** | ||||
| 	 * Re-index Segments | ||||
| 	 * | ||||
| 	 * This function re-indexes the $this->segment array so that it | ||||
| 	 * starts at 1 rather than 0.  Doing so makes it simpler to | ||||
| 	 * use functions like $this->uri->segment(n) since there is | ||||
| 	 * a 1:1 relationship between the segment array and the actual segments. | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _reindex_segments() | ||||
| 	{ | ||||
| 		array_unshift($this->segments, NULL); | ||||
| 		array_unshift($this->rsegments, NULL); | ||||
| 		unset($this->segments[0]); | ||||
| 		unset($this->rsegments[0]); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a URI Segment | ||||
| 	 * | ||||
| 	 * This function returns the URI segment based on the number provided. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	integer | ||||
| 	 * @param	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function segment($n, $no_result = FALSE) | ||||
| 	{ | ||||
| 		return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a URI "routed" Segment | ||||
| 	 * | ||||
| 	 * This function returns the re-routed URI segment (assuming routing rules are used) | ||||
| 	 * based on the number provided.  If there is no routing this function returns the | ||||
| 	 * same result as $this->segment() | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	integer | ||||
| 	 * @param	bool | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function rsegment($n, $no_result = FALSE) | ||||
| 	{ | ||||
| 		return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Generate a key value pair from the URI string | ||||
| 	 * | ||||
| 	 * This function generates and associative array of URI data starting | ||||
| 	 * at the supplied segment. For example, if this is your URI: | ||||
| 	 * | ||||
| 	 *	example.com/user/search/name/joe/location/UK/gender/male | ||||
| 	 * | ||||
| 	 * You can use this function to generate an array with this prototype: | ||||
| 	 * | ||||
| 	 * array ( | ||||
| 	 *			name => joe | ||||
| 	 *			location => UK | ||||
| 	 *			gender => male | ||||
| 	 *		 ) | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	integer	the starting segment number | ||||
| 	 * @param	array	an array of default values | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function uri_to_assoc($n = 3, $default = array()) | ||||
| 	{ | ||||
| 		return $this->_uri_to_assoc($n, $default, 'segment'); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Identical to above only it uses the re-routed segment array | ||||
| 	 * | ||||
| 	 * @access 	public | ||||
| 	 * @param 	integer	the starting segment number | ||||
| 	 * @param 	array	an array of default values | ||||
| 	 * @return 	array | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function ruri_to_assoc($n = 3, $default = array()) | ||||
| 	{ | ||||
| 		return $this->_uri_to_assoc($n, $default, 'rsegment'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Generate a key value pair from the URI string or Re-routed URI string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	integer	the starting segment number | ||||
| 	 * @param	array	an array of default values | ||||
| 	 * @param	string	which array we should use | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') | ||||
| 	{ | ||||
| 		if ($which == 'segment') | ||||
| 		{ | ||||
| 			$total_segments = 'total_segments'; | ||||
| 			$segment_array = 'segment_array'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$total_segments = 'total_rsegments'; | ||||
| 			$segment_array = 'rsegment_array'; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_numeric($n)) | ||||
| 		{ | ||||
| 			return $default; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($this->keyval[$n])) | ||||
| 		{ | ||||
| 			return $this->keyval[$n]; | ||||
| 		} | ||||
|  | ||||
| 		if ($this->$total_segments() < $n) | ||||
| 		{ | ||||
| 			if (count($default) == 0) | ||||
| 			{ | ||||
| 				return array(); | ||||
| 			} | ||||
|  | ||||
| 			$retval = array(); | ||||
| 			foreach ($default as $val) | ||||
| 			{ | ||||
| 				$retval[$val] = FALSE; | ||||
| 			} | ||||
| 			return $retval; | ||||
| 		} | ||||
|  | ||||
| 		$segments = array_slice($this->$segment_array(), ($n - 1)); | ||||
|  | ||||
| 		$i = 0; | ||||
| 		$lastval = ''; | ||||
| 		$retval  = array(); | ||||
| 		foreach ($segments as $seg) | ||||
| 		{ | ||||
| 			if ($i % 2) | ||||
| 			{ | ||||
| 				$retval[$lastval] = $seg; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$retval[$seg] = FALSE; | ||||
| 				$lastval = $seg; | ||||
| 			} | ||||
|  | ||||
| 			$i++; | ||||
| 		} | ||||
|  | ||||
| 		if (count($default) > 0) | ||||
| 		{ | ||||
| 			foreach ($default as $val) | ||||
| 			{ | ||||
| 				if ( ! array_key_exists($val, $retval)) | ||||
| 				{ | ||||
| 					$retval[$val] = FALSE; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Cache the array for reuse | ||||
| 		$this->keyval[$n] = $retval; | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Generate a URI string from an associative array | ||||
| 	 * | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	array	an associative array of key/values | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function assoc_to_uri($array) | ||||
| 	{ | ||||
| 		$temp = array(); | ||||
| 		foreach ((array)$array as $key => $val) | ||||
| 		{ | ||||
| 			$temp[] = $key; | ||||
| 			$temp[] = $val; | ||||
| 		} | ||||
|  | ||||
| 		return implode('/', $temp); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a URI Segment and add a trailing slash | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	integer | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function slash_segment($n, $where = 'trailing') | ||||
| 	{ | ||||
| 		return $this->_slash_segment($n, $where, 'segment'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a URI Segment and add a trailing slash | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	integer | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function slash_rsegment($n, $where = 'trailing') | ||||
| 	{ | ||||
| 		return $this->_slash_segment($n, $where, 'rsegment'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch a URI Segment and add a trailing slash - helper function | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	integer | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _slash_segment($n, $where = 'trailing', $which = 'segment') | ||||
| 	{ | ||||
| 		$leading	= '/'; | ||||
| 		$trailing	= '/'; | ||||
|  | ||||
| 		if ($where == 'trailing') | ||||
| 		{ | ||||
| 			$leading	= ''; | ||||
| 		} | ||||
| 		elseif ($where == 'leading') | ||||
| 		{ | ||||
| 			$trailing	= ''; | ||||
| 		} | ||||
|  | ||||
| 		return $leading.$this->$which($n).$trailing; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Segment Array | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function segment_array() | ||||
| 	{ | ||||
| 		return $this->segments; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Routed Segment Array | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function rsegment_array() | ||||
| 	{ | ||||
| 		return $this->rsegments; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Total number of segments | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function total_segments() | ||||
| 	{ | ||||
| 		return count($this->segments); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Total number of routed segments | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function total_rsegments() | ||||
| 	{ | ||||
| 		return count($this->rsegments); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch the entire URI string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function uri_string() | ||||
| 	{ | ||||
| 		return $this->uri_string; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch the entire Re-routed URI string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function ruri_string() | ||||
| 	{ | ||||
| 		return '/'.implode('/', $this->rsegment_array()); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| // END URI Class | ||||
|  | ||||
| /* End of file URI.php */ | ||||
| /* Location: ./system/core/URI.php */ | ||||
							
								
								
									
										165
									
								
								system/core/Utf8.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								system/core/Utf8.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,165 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Utf8 Class | ||||
|  * | ||||
|  * Provides support for UTF-8 environments | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Libraries | ||||
|  * @category	UTF-8 | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/libraries/utf8.html | ||||
|  */ | ||||
| class CI_Utf8 { | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Determines if UTF-8 support is to be enabled | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		log_message('debug', "Utf8 Class Initialized"); | ||||
|  | ||||
| 		global $CFG; | ||||
|  | ||||
| 		if ( | ||||
| 			preg_match('/./u', 'é') === 1					// PCRE must support UTF-8 | ||||
| 			AND function_exists('iconv')					// iconv must be installed | ||||
| 			AND ini_get('mbstring.func_overload') != 1		// Multibyte string function overloading cannot be enabled | ||||
| 			AND $CFG->item('charset') == 'UTF-8'			// Application charset must be UTF-8 | ||||
| 			) | ||||
| 		{ | ||||
| 			log_message('debug', "UTF-8 Support Enabled"); | ||||
|  | ||||
| 			define('UTF8_ENABLED', TRUE); | ||||
|  | ||||
| 			// set internal encoding for multibyte string functions if necessary | ||||
| 			// and set a flag so we don't have to repeatedly use extension_loaded() | ||||
| 			// or function_exists() | ||||
| 			if (extension_loaded('mbstring')) | ||||
| 			{ | ||||
| 				define('MB_ENABLED', TRUE); | ||||
| 				mb_internal_encoding('UTF-8'); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				define('MB_ENABLED', FALSE); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			log_message('debug', "UTF-8 Support Disabled"); | ||||
| 			define('UTF8_ENABLED', FALSE); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Clean UTF-8 strings | ||||
| 	 * | ||||
| 	 * Ensures strings are UTF-8 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function clean_string($str) | ||||
| 	{ | ||||
| 		if ($this->_is_ascii($str) === FALSE) | ||||
| 		{ | ||||
| 			$str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Remove ASCII control characters | ||||
| 	 * | ||||
| 	 * Removes all ASCII control characters except horizontal tabs, | ||||
| 	 * line feeds, and carriage returns, as all others can cause | ||||
| 	 * problems in XML | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function safe_ascii_for_xml($str) | ||||
| 	{ | ||||
| 		return remove_invisible_characters($str, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Convert to UTF-8 | ||||
| 	 * | ||||
| 	 * Attempts to convert a string to UTF-8 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string	- input encoding | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function convert_to_utf8($str, $encoding) | ||||
| 	{ | ||||
| 		if (function_exists('iconv')) | ||||
| 		{ | ||||
| 			$str = @iconv($encoding, 'UTF-8', $str); | ||||
| 		} | ||||
| 		elseif (function_exists('mb_convert_encoding')) | ||||
| 		{ | ||||
| 			$str = @mb_convert_encoding($str, 'UTF-8', $encoding); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Is ASCII? | ||||
| 	 * | ||||
| 	 * Tests if a string is standard 7-bit ASCII or not | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _is_ascii($str) | ||||
| 	{ | ||||
| 		return (preg_match('/[^\x00-\x7F]/S', $str) == 0); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| } | ||||
| // End Utf8 Class | ||||
|  | ||||
| /* End of file Utf8.php */ | ||||
| /* Location: ./system/core/Utf8.php */ | ||||
							
								
								
									
										10
									
								
								system/core/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/core/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										162
									
								
								system/database/DB.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								system/database/DB.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,162 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Initialize the database | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  * @param 	string | ||||
|  * @param 	bool	Determines if active record should be used or not | ||||
|  */ | ||||
| function &DB($params = '', $active_record_override = NULL) | ||||
| { | ||||
| 	// Load the DB config file if a DSN string wasn't passed | ||||
| 	if (is_string($params) AND strpos($params, '://') === FALSE) | ||||
| 	{ | ||||
| 		// Is the config file in the environment folder? | ||||
| 		if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/database.php')) | ||||
| 		{ | ||||
| 			if ( ! file_exists($file_path = APPPATH.'config/database.php')) | ||||
| 			{ | ||||
| 				show_error('The configuration file database.php does not exist.'); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		include($file_path); | ||||
|  | ||||
| 		if ( ! isset($db) OR count($db) == 0) | ||||
| 		{ | ||||
| 			show_error('No database connection settings were found in the database config file.'); | ||||
| 		} | ||||
|  | ||||
| 		if ($params != '') | ||||
| 		{ | ||||
| 			$active_group = $params; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! isset($active_group) OR ! isset($db[$active_group])) | ||||
| 		{ | ||||
| 			show_error('You have specified an invalid database connection group.'); | ||||
| 		} | ||||
|  | ||||
| 		$params = $db[$active_group]; | ||||
| 	} | ||||
| 	elseif (is_string($params)) | ||||
| 	{ | ||||
|  | ||||
| 		/* parse the URL from the DSN string | ||||
| 		 *  Database settings can be passed as discreet | ||||
| 		 *  parameters or as a data source name in the first | ||||
| 		 *  parameter. DSNs must have this prototype: | ||||
| 		 *  $dsn = 'driver://username:password@hostname/database'; | ||||
| 		 */ | ||||
|  | ||||
| 		if (($dns = @parse_url($params)) === FALSE) | ||||
| 		{ | ||||
| 			show_error('Invalid DB Connection String'); | ||||
| 		} | ||||
|  | ||||
| 		$params = array( | ||||
| 							'dbdriver'	=> $dns['scheme'], | ||||
| 							'hostname'	=> (isset($dns['host'])) ? rawurldecode($dns['host']) : '', | ||||
| 							'username'	=> (isset($dns['user'])) ? rawurldecode($dns['user']) : '', | ||||
| 							'password'	=> (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '', | ||||
| 							'database'	=> (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : '' | ||||
| 						); | ||||
|  | ||||
| 		// were additional config items set? | ||||
| 		if (isset($dns['query'])) | ||||
| 		{ | ||||
| 			parse_str($dns['query'], $extra); | ||||
|  | ||||
| 			foreach ($extra as $key => $val) | ||||
| 			{ | ||||
| 				// booleans please | ||||
| 				if (strtoupper($val) == "TRUE") | ||||
| 				{ | ||||
| 					$val = TRUE; | ||||
| 				} | ||||
| 				elseif (strtoupper($val) == "FALSE") | ||||
| 				{ | ||||
| 					$val = FALSE; | ||||
| 				} | ||||
|  | ||||
| 				$params[$key] = $val; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// No DB specified yet?  Beat them senseless... | ||||
| 	if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '') | ||||
| 	{ | ||||
| 		show_error('You have not selected a database type to connect to.'); | ||||
| 	} | ||||
|  | ||||
| 	// Load the DB classes.  Note: Since the active record class is optional | ||||
| 	// we need to dynamically create a class that extends proper parent class | ||||
| 	// based on whether we're using the active record class or not. | ||||
| 	// Kudos to Paul for discovering this clever use of eval() | ||||
|  | ||||
| 	if ($active_record_override !== NULL) | ||||
| 	{ | ||||
| 		$active_record = $active_record_override; | ||||
| 	} | ||||
|  | ||||
| 	require_once(BASEPATH.'database/DB_driver.php'); | ||||
|  | ||||
| 	if ( ! isset($active_record) OR $active_record == TRUE) | ||||
| 	{ | ||||
| 		require_once(BASEPATH.'database/DB_active_rec.php'); | ||||
|  | ||||
| 		if ( ! class_exists('CI_DB')) | ||||
| 		{ | ||||
| 			eval('class CI_DB extends CI_DB_active_record { }'); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		if ( ! class_exists('CI_DB')) | ||||
| 		{ | ||||
| 			eval('class CI_DB extends CI_DB_driver { }'); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'); | ||||
|  | ||||
| 	// Instantiate the DB adapter | ||||
| 	$driver = 'CI_DB_'.$params['dbdriver'].'_driver'; | ||||
| 	$DB = new $driver($params); | ||||
|  | ||||
| 	if ($DB->autoinit == TRUE) | ||||
| 	{ | ||||
| 		$DB->initialize(); | ||||
| 	} | ||||
|  | ||||
| 	if (isset($params['stricton']) && $params['stricton'] == TRUE) | ||||
| 	{ | ||||
| 		$DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); | ||||
| 	} | ||||
|  | ||||
| 	return $DB; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* End of file DB.php */ | ||||
| /* Location: ./system/database/DB.php */ | ||||
							
								
								
									
										2045
									
								
								system/database/DB_active_rec.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2045
									
								
								system/database/DB_active_rec.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										195
									
								
								system/database/DB_cache.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								system/database/DB_cache.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,195 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Database Cache Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_Cache { | ||||
|  | ||||
| 	var $CI; | ||||
| 	var $db;	// allows passing of db object so that multiple database connections and returned db objects can be supported | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Grabs the CI super object instance so we can access it. | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function __construct(&$db) | ||||
| 	{ | ||||
| 		// Assign the main CI object to $this->CI | ||||
| 		// and load the file helper since we use it a lot | ||||
| 		$this->CI =& get_instance(); | ||||
| 		$this->db =& $db; | ||||
| 		$this->CI->load->helper('file'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set Cache Directory Path | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the path to the cache directory | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function check_path($path = '') | ||||
| 	{ | ||||
| 		if ($path == '') | ||||
| 		{ | ||||
| 			if ($this->db->cachedir == '') | ||||
| 			{ | ||||
| 				return $this->db->cache_off(); | ||||
| 			} | ||||
|  | ||||
| 			$path = $this->db->cachedir; | ||||
| 		} | ||||
|  | ||||
| 		// Add a trailing slash to the path if needed | ||||
| 		$path = preg_replace("/(.+?)\/*$/", "\\1/",  $path); | ||||
|  | ||||
| 		if ( ! is_dir($path) OR ! is_really_writable($path)) | ||||
| 		{ | ||||
| 			// If the path is wrong we'll turn off caching | ||||
| 			return $this->db->cache_off(); | ||||
| 		} | ||||
|  | ||||
| 		$this->db->cachedir = $path; | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Retrieve a cached query | ||||
| 	 * | ||||
| 	 * The URI being requested will become the name of the cache sub-folder. | ||||
| 	 * An MD5 hash of the SQL statement will become the cache file name | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function read($sql) | ||||
| 	{ | ||||
| 		if ( ! $this->check_path()) | ||||
| 		{ | ||||
| 			return $this->db->cache_off(); | ||||
| 		} | ||||
|  | ||||
| 		$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); | ||||
|  | ||||
| 		$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); | ||||
|  | ||||
| 		$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); | ||||
|  | ||||
| 		if (FALSE === ($cachedata = read_file($filepath))) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return unserialize($cachedata); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Write a query to a cache file | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function write($sql, $object) | ||||
| 	{ | ||||
| 		if ( ! $this->check_path()) | ||||
| 		{ | ||||
| 			return $this->db->cache_off(); | ||||
| 		} | ||||
|  | ||||
| 		$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); | ||||
|  | ||||
| 		$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); | ||||
|  | ||||
| 		$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; | ||||
|  | ||||
| 		$filename = md5($sql); | ||||
|  | ||||
| 		if ( ! @is_dir($dir_path)) | ||||
| 		{ | ||||
| 			if ( ! @mkdir($dir_path, DIR_WRITE_MODE)) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
|  | ||||
| 			@chmod($dir_path, DIR_WRITE_MODE); | ||||
| 		} | ||||
|  | ||||
| 		if (write_file($dir_path.$filename, serialize($object)) === FALSE) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		@chmod($dir_path.$filename, FILE_WRITE_MODE); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete cache files within a particular directory | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function delete($segment_one = '', $segment_two = '') | ||||
| 	{ | ||||
| 		if ($segment_one == '') | ||||
| 		{ | ||||
| 			$segment_one  = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); | ||||
| 		} | ||||
|  | ||||
| 		if ($segment_two == '') | ||||
| 		{ | ||||
| 			$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); | ||||
| 		} | ||||
|  | ||||
| 		$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; | ||||
|  | ||||
| 		delete_files($dir_path, TRUE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete all existing cache files | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function delete_all() | ||||
| 	{ | ||||
| 		delete_files($this->db->cachedir, TRUE); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file DB_cache.php */ | ||||
| /* Location: ./system/database/DB_cache.php */ | ||||
							
								
								
									
										1410
									
								
								system/database/DB_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1410
									
								
								system/database/DB_driver.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										382
									
								
								system/database/DB_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										382
									
								
								system/database/DB_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,382 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * Code Igniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Database Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_forge { | ||||
|  | ||||
| 	var $fields			= array(); | ||||
| 	var $keys			= array(); | ||||
| 	var $primary_keys	= array(); | ||||
| 	var $db_char_set	=	''; | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Grabs the CI super object instance so we can access it. | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		// Assign the main database object to $this->db | ||||
| 		$CI =& get_instance(); | ||||
| 		$this->db =& $CI->db; | ||||
| 		log_message('debug', "Database Forge Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function create_database($db_name) | ||||
| 	{ | ||||
| 		$sql = $this->_create_database($db_name); | ||||
|  | ||||
| 		if (is_bool($sql)) | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		return $this->db->query($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function drop_database($db_name) | ||||
| 	{ | ||||
| 		$sql = $this->_drop_database($db_name); | ||||
|  | ||||
| 		if (is_bool($sql)) | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		return $this->db->query($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Add Key | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	key | ||||
| 	 * @param	string	type | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function add_key($key = '', $primary = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($key)) | ||||
| 		{ | ||||
| 			foreach ($key as $one) | ||||
| 			{ | ||||
| 				$this->add_key($one, $primary); | ||||
| 			} | ||||
|  | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		if ($key == '') | ||||
| 		{ | ||||
| 			show_error('Key information is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		if ($primary === TRUE) | ||||
| 		{ | ||||
| 			$this->primary_keys[] = $key; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->keys[] = $key; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Add Field | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	collation | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function add_field($field = '') | ||||
| 	{ | ||||
| 		if ($field == '') | ||||
| 		{ | ||||
| 			show_error('Field information is required.'); | ||||
| 		} | ||||
|  | ||||
| 		if (is_string($field)) | ||||
| 		{ | ||||
| 			if ($field == 'id') | ||||
| 			{ | ||||
| 				$this->add_field(array( | ||||
| 										'id' => array( | ||||
| 													'type' => 'INT', | ||||
| 													'constraint' => 9, | ||||
| 													'auto_increment' => TRUE | ||||
| 													) | ||||
| 								)); | ||||
| 				$this->add_key('id', TRUE); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if (strpos($field, ' ') === FALSE) | ||||
| 				{ | ||||
| 					show_error('Field information is required for that operation.'); | ||||
| 				} | ||||
|  | ||||
| 				$this->fields[] = $field; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($field)) | ||||
| 		{ | ||||
| 			$this->fields = array_merge($this->fields, $field); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function create_table($table = '', $if_not_exists = FALSE) | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			show_error('A table name is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		if (count($this->fields) == 0) | ||||
| 		{ | ||||
| 			show_error('Field information is required.'); | ||||
| 		} | ||||
|  | ||||
| 		$sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists); | ||||
|  | ||||
| 		$this->_reset(); | ||||
| 		return $this->db->query($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function drop_table($table_name) | ||||
| 	{ | ||||
| 		$sql = $this->_drop_table($this->db->dbprefix.$table_name); | ||||
|  | ||||
| 		if (is_bool($sql)) | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		return $this->db->query($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename Table | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		if ($table_name == '' OR $new_table_name == '') | ||||
| 		{ | ||||
| 			show_error('A table name is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		$sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name); | ||||
| 		return $this->db->query($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Column Add | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function add_column($table = '', $field = array(), $after_field = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			show_error('A table name is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		// add field info into field array, but we can only do one at a time | ||||
| 		// so we cycle through | ||||
|  | ||||
| 		foreach ($field as $k => $v) | ||||
| 		{ | ||||
| 			$this->add_field(array($k => $field[$k])); | ||||
|  | ||||
| 			if (count($this->fields) == 0) | ||||
| 			{ | ||||
| 				show_error('Field information is required.'); | ||||
| 			} | ||||
|  | ||||
| 			$sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field); | ||||
|  | ||||
| 			$this->_reset(); | ||||
|  | ||||
| 			if ($this->db->query($sql) === FALSE) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Column Drop | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function drop_column($table = '', $column_name = '') | ||||
| 	{ | ||||
|  | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			show_error('A table name is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		if ($column_name == '') | ||||
| 		{ | ||||
| 			show_error('A column name is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); | ||||
|  | ||||
| 		return $this->db->query($sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Column Modify | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function modify_column($table = '', $field = array()) | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			show_error('A table name is required for that operation.'); | ||||
| 		} | ||||
|  | ||||
| 		// add field info into field array, but we can only do one at a time | ||||
| 		// so we cycle through | ||||
|  | ||||
| 		foreach ($field as $k => $v) | ||||
| 		{ | ||||
| 			// If no name provided, use the current name | ||||
| 			if ( ! isset($field[$k]['name'])) | ||||
| 			{ | ||||
| 				$field[$k]['name'] = $k; | ||||
| 			} | ||||
|  | ||||
| 			$this->add_field(array($k => $field[$k])); | ||||
|  | ||||
| 			if (count($this->fields) == 0) | ||||
| 			{ | ||||
| 				show_error('Field information is required.'); | ||||
| 			} | ||||
|  | ||||
| 			$sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields); | ||||
|  | ||||
| 			$this->_reset(); | ||||
|  | ||||
| 			if ($this->db->query($sql) === FALSE) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reset | ||||
| 	 * | ||||
| 	 * Resets table creation vars | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _reset() | ||||
| 	{ | ||||
| 		$this->fields		= array(); | ||||
| 		$this->keys			= array(); | ||||
| 		$this->primary_keys	= array(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file DB_forge.php */ | ||||
| /* Location: ./system/database/DB_forge.php */ | ||||
							
								
								
									
										410
									
								
								system/database/DB_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										410
									
								
								system/database/DB_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,410 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Database Result Class | ||||
|  * | ||||
|  * This is the platform-independent result class. | ||||
|  * This class will not be called directly. Rather, the adapter | ||||
|  * class for the specific database will extend and instantiate it. | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_result { | ||||
|  | ||||
| 	var $conn_id				= NULL; | ||||
| 	var $result_id				= NULL; | ||||
| 	var $result_array			= array(); | ||||
| 	var $result_object			= array(); | ||||
| 	var $custom_result_object	= array(); | ||||
| 	var $current_row			= 0; | ||||
| 	var $num_rows				= 0; | ||||
| 	var $row_data				= NULL; | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Query result.  Acts as a wrapper function for the following functions. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	can be "object" or "array" | ||||
| 	 * @return	mixed	either a result object or array | ||||
| 	 */ | ||||
| 	public function result($type = 'object') | ||||
| 	{ | ||||
| 		if ($type == 'array') return $this->result_array(); | ||||
| 		else if ($type == 'object') return $this->result_object(); | ||||
| 		else return $this->custom_result_object($type); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Custom query result. | ||||
| 	 * | ||||
| 	 * @param class_name A string that represents the type of object you want back | ||||
| 	 * @return array of objects | ||||
| 	 */ | ||||
| 	public function custom_result_object($class_name) | ||||
| 	{ | ||||
| 		if (array_key_exists($class_name, $this->custom_result_object)) | ||||
| 		{ | ||||
| 			return $this->custom_result_object[$class_name]; | ||||
| 		} | ||||
|  | ||||
| 		if ($this->result_id === FALSE OR $this->num_rows() == 0) | ||||
| 		{ | ||||
| 			return array(); | ||||
| 		} | ||||
|  | ||||
| 		// add the data to the object | ||||
| 		$this->_data_seek(0); | ||||
| 		$result_object = array(); | ||||
|  | ||||
| 		while ($row = $this->_fetch_object()) | ||||
| 		{ | ||||
| 			$object = new $class_name(); | ||||
|  | ||||
| 			foreach ($row as $key => $value) | ||||
| 			{ | ||||
| 				$object->$key = $value; | ||||
| 			} | ||||
|  | ||||
| 			$result_object[] = $object; | ||||
| 		} | ||||
|  | ||||
| 		// return the array | ||||
| 		return $this->custom_result_object[$class_name] = $result_object; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Query result.  "object" version. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function result_object() | ||||
| 	{ | ||||
| 		if (count($this->result_object) > 0) | ||||
| 		{ | ||||
| 			return $this->result_object; | ||||
| 		} | ||||
|  | ||||
| 		// In the event that query caching is on the result_id variable | ||||
| 		// will return FALSE since there isn't a valid SQL resource so | ||||
| 		// we'll simply return an empty array. | ||||
| 		if ($this->result_id === FALSE OR $this->num_rows() == 0) | ||||
| 		{ | ||||
| 			return array(); | ||||
| 		} | ||||
|  | ||||
| 		$this->_data_seek(0); | ||||
| 		while ($row = $this->_fetch_object()) | ||||
| 		{ | ||||
| 			$this->result_object[] = $row; | ||||
| 		} | ||||
|  | ||||
| 		return $this->result_object; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Query result.  "array" version. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function result_array() | ||||
| 	{ | ||||
| 		if (count($this->result_array) > 0) | ||||
| 		{ | ||||
| 			return $this->result_array; | ||||
| 		} | ||||
|  | ||||
| 		// In the event that query caching is on the result_id variable | ||||
| 		// will return FALSE since there isn't a valid SQL resource so | ||||
| 		// we'll simply return an empty array. | ||||
| 		if ($this->result_id === FALSE OR $this->num_rows() == 0) | ||||
| 		{ | ||||
| 			return array(); | ||||
| 		} | ||||
|  | ||||
| 		$this->_data_seek(0); | ||||
| 		while ($row = $this->_fetch_assoc()) | ||||
| 		{ | ||||
| 			$this->result_array[] = $row; | ||||
| 		} | ||||
|  | ||||
| 		return $this->result_array; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Query result.  Acts as a wrapper function for the following functions. | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string	can be "object" or "array" | ||||
| 	 * @return	mixed	either a result object or array | ||||
| 	 */ | ||||
| 	public function row($n = 0, $type = 'object') | ||||
| 	{ | ||||
| 		if ( ! is_numeric($n)) | ||||
| 		{ | ||||
| 			// We cache the row data for subsequent uses | ||||
| 			if ( ! is_array($this->row_data)) | ||||
| 			{ | ||||
| 				$this->row_data = $this->row_array(0); | ||||
| 			} | ||||
|  | ||||
| 			// array_key_exists() instead of isset() to allow for MySQL NULL values | ||||
| 			if (array_key_exists($n, $this->row_data)) | ||||
| 			{ | ||||
| 				return $this->row_data[$n]; | ||||
| 			} | ||||
| 			// reset the $n variable if the result was not achieved | ||||
| 			$n = 0; | ||||
| 		} | ||||
|  | ||||
| 		if ($type == 'object') return $this->row_object($n); | ||||
| 		else if ($type == 'array') return $this->row_array($n); | ||||
| 		else return $this->custom_row_object($n, $type); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Assigns an item into a particular column slot | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function set_row($key, $value = NULL) | ||||
| 	{ | ||||
| 		// We cache the row data for subsequent uses | ||||
| 		if ( ! is_array($this->row_data)) | ||||
| 		{ | ||||
| 			$this->row_data = $this->row_array(0); | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($key)) | ||||
| 		{ | ||||
| 			foreach ($key as $k => $v) | ||||
| 			{ | ||||
| 				$this->row_data[$k] = $v; | ||||
| 			} | ||||
|  | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		if ($key != '' AND ! is_null($value)) | ||||
| 		{ | ||||
| 			$this->row_data[$key] = $value; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns a single result row - custom object version | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function custom_row_object($n, $type) | ||||
| 	{ | ||||
| 		$result = $this->custom_result_object($type); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
|  | ||||
| 		if ($n != $this->current_row AND isset($result[$n])) | ||||
| 		{ | ||||
| 			$this->current_row = $n; | ||||
| 		} | ||||
|  | ||||
| 		return $result[$this->current_row]; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns a single result row - object version | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function row_object($n = 0) | ||||
| 	{ | ||||
| 		$result = $this->result_object(); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
|  | ||||
| 		if ($n != $this->current_row AND isset($result[$n])) | ||||
| 		{ | ||||
| 			$this->current_row = $n; | ||||
| 		} | ||||
|  | ||||
| 		return $result[$this->current_row]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns a single result row - array version | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function row_array($n = 0) | ||||
| 	{ | ||||
| 		$result = $this->result_array(); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
|  | ||||
| 		if ($n != $this->current_row AND isset($result[$n])) | ||||
| 		{ | ||||
| 			$this->current_row = $n; | ||||
| 		} | ||||
|  | ||||
| 		return $result[$this->current_row]; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns the "first" row | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function first_row($type = 'object') | ||||
| 	{ | ||||
| 		$result = $this->result($type); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
| 		return $result[0]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns the "last" row | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function last_row($type = 'object') | ||||
| 	{ | ||||
| 		$result = $this->result($type); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
| 		return $result[count($result) -1]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns the "next" row | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function next_row($type = 'object') | ||||
| 	{ | ||||
| 		$result = $this->result($type); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($result[$this->current_row + 1])) | ||||
| 		{ | ||||
| 			++$this->current_row; | ||||
| 		} | ||||
|  | ||||
| 		return $result[$this->current_row]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns the "previous" row | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	public function previous_row($type = 'object') | ||||
| 	{ | ||||
| 		$result = $this->result($type); | ||||
|  | ||||
| 		if (count($result) == 0) | ||||
| 		{ | ||||
| 			return $result; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($result[$this->current_row - 1])) | ||||
| 		{ | ||||
| 			--$this->current_row; | ||||
| 		} | ||||
| 		return $result[$this->current_row]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The following functions are normally overloaded by the identically named | ||||
| 	 * methods in the platform-specific driver -- except when query caching | ||||
| 	 * is used.  When caching is enabled we do not load the other driver. | ||||
| 	 * These functions are primarily here to prevent undefined function errors | ||||
| 	 * when a cached result object is in use.  They are not otherwise fully | ||||
| 	 * operational due to the unavailability of the database resource IDs with | ||||
| 	 * cached results. | ||||
| 	 */ | ||||
| 	public function num_rows() { return $this->num_rows; } | ||||
| 	public function num_fields() { return 0; } | ||||
| 	public function list_fields() { return array(); } | ||||
| 	public function field_data() { return array(); } | ||||
| 	public function free_result() { return TRUE; } | ||||
| 	protected function _data_seek() { return TRUE; } | ||||
| 	protected function _fetch_assoc() { return array(); } | ||||
| 	protected function _fetch_object() { return array(); } | ||||
|  | ||||
| } | ||||
| // END DB_result class | ||||
|  | ||||
| /* End of file DB_result.php */ | ||||
| /* Location: ./system/database/DB_result.php */ | ||||
							
								
								
									
										414
									
								
								system/database/DB_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										414
									
								
								system/database/DB_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,414 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * Code Igniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Database Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_utility extends CI_DB_forge { | ||||
|  | ||||
| 	var $db; | ||||
| 	var $data_cache		= array(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * Grabs the CI super object instance so we can access it. | ||||
| 	 * | ||||
| 	 */ | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		// Assign the main database object to $this->db | ||||
| 		$CI =& get_instance(); | ||||
| 		$this->db =& $CI->db; | ||||
|  | ||||
| 		log_message('debug', "Database Utility Class Initialized"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function list_databases() | ||||
| 	{ | ||||
| 		// Is there a cached result? | ||||
| 		if (isset($this->data_cache['db_names'])) | ||||
| 		{ | ||||
| 			return $this->data_cache['db_names']; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->db->query($this->_list_databases()); | ||||
| 		$dbs = array(); | ||||
| 		if ($query->num_rows() > 0) | ||||
| 		{ | ||||
| 			foreach ($query->result_array() as $row) | ||||
| 			{ | ||||
| 				$dbs[] = current($row); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$this->data_cache['db_names'] = $dbs; | ||||
| 		return $this->data_cache['db_names']; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Determine if a particular database exists | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	boolean | ||||
| 	 */ | ||||
| 	function database_exists($database_name) | ||||
| 	{ | ||||
| 		// Some databases won't have access to the list_databases() function, so | ||||
| 		// this is intended to allow them to override with their own functions as | ||||
| 		// defined in $driver_utility.php | ||||
| 		if (method_exists($this, '_database_exists')) | ||||
| 		{ | ||||
| 			return $this->_database_exists($database_name); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize Table | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function optimize_table($table_name) | ||||
| 	{ | ||||
| 		$sql = $this->_optimize_table($table_name); | ||||
|  | ||||
| 		if (is_bool($sql)) | ||||
| 		{ | ||||
| 				show_error('db_must_use_set'); | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->db->query($sql); | ||||
| 		$res = $query->result_array(); | ||||
|  | ||||
| 		// Note: Due to a bug in current() that affects some versions | ||||
| 		// of PHP we can not pass function call directly into it | ||||
| 		return current($res); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize Database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function optimize_database() | ||||
| 	{ | ||||
| 		$result = array(); | ||||
| 		foreach ($this->db->list_tables() as $table_name) | ||||
| 		{ | ||||
| 			$sql = $this->_optimize_table($table_name); | ||||
|  | ||||
| 			if (is_bool($sql)) | ||||
| 			{ | ||||
| 				return $sql; | ||||
| 			} | ||||
|  | ||||
| 			$query = $this->db->query($sql); | ||||
|  | ||||
| 			// Build the result array... | ||||
| 			// Note: Due to a bug in current() that affects some versions | ||||
| 			// of PHP we can not pass function call directly into it | ||||
| 			$res = $query->result_array(); | ||||
| 			$res = current($res); | ||||
| 			$key = str_replace($this->db->database.'.', '', current($res)); | ||||
| 			$keys = array_keys($res); | ||||
| 			unset($res[$keys[0]]); | ||||
|  | ||||
| 			$result[$key] = $res; | ||||
| 		} | ||||
|  | ||||
| 		return $result; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair Table | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function repair_table($table_name) | ||||
| 	{ | ||||
| 		$sql = $this->_repair_table($table_name); | ||||
|  | ||||
| 		if (is_bool($sql)) | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->db->query($sql); | ||||
|  | ||||
| 		// Note: Due to a bug in current() that affects some versions | ||||
| 		// of PHP we can not pass function call directly into it | ||||
| 		$res = $query->result_array(); | ||||
| 		return current($res); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Generate CSV from a query result object | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	object	The query result object | ||||
| 	 * @param	string	The delimiter - comma by default | ||||
| 	 * @param	string	The newline character - \n by default | ||||
| 	 * @param	string	The enclosure - double quote by default | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"') | ||||
| 	{ | ||||
| 		if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) | ||||
| 		{ | ||||
| 			show_error('You must submit a valid result object'); | ||||
| 		} | ||||
|  | ||||
| 		$out = ''; | ||||
|  | ||||
| 		// First generate the headings from the table column names | ||||
| 		foreach ($query->list_fields() as $name) | ||||
| 		{ | ||||
| 			$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; | ||||
| 		} | ||||
|  | ||||
| 		$out = rtrim($out); | ||||
| 		$out .= $newline; | ||||
|  | ||||
| 		// Next blast through the result array and build out the rows | ||||
| 		foreach ($query->result_array() as $row) | ||||
| 		{ | ||||
| 			foreach ($row as $item) | ||||
| 			{ | ||||
| 				$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; | ||||
| 			} | ||||
| 			$out = rtrim($out); | ||||
| 			$out .= $newline; | ||||
| 		} | ||||
|  | ||||
| 		return $out; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Generate XML data from a query result object | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	object	The query result object | ||||
| 	 * @param	array	Any preferences | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function xml_from_result($query, $params = array()) | ||||
| 	{ | ||||
| 		if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) | ||||
| 		{ | ||||
| 			show_error('You must submit a valid result object'); | ||||
| 		} | ||||
|  | ||||
| 		// Set our default values | ||||
| 		foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) | ||||
| 		{ | ||||
| 			if ( ! isset($params[$key])) | ||||
| 			{ | ||||
| 				$params[$key] = $val; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Create variables for convenience | ||||
| 		extract($params); | ||||
|  | ||||
| 		// Load the xml helper | ||||
| 		$CI =& get_instance(); | ||||
| 		$CI->load->helper('xml'); | ||||
|  | ||||
| 		// Generate the result | ||||
| 		$xml = "<{$root}>".$newline; | ||||
| 		foreach ($query->result_array() as $row) | ||||
| 		{ | ||||
| 			$xml .= $tab."<{$element}>".$newline; | ||||
|  | ||||
| 			foreach ($row as $key => $val) | ||||
| 			{ | ||||
| 				$xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline; | ||||
| 			} | ||||
| 			$xml .= $tab."</{$element}>".$newline; | ||||
| 		} | ||||
| 		$xml .= "</$root>".$newline; | ||||
|  | ||||
| 		return $xml; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Database Backup | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function backup($params = array()) | ||||
| 	{ | ||||
| 		// If the parameters have not been submitted as an | ||||
| 		// array then we know that it is simply the table | ||||
| 		// name, which is a valid short cut. | ||||
| 		if (is_string($params)) | ||||
| 		{ | ||||
| 			$params = array('tables' => $params); | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Set up our default preferences | ||||
| 		$prefs = array( | ||||
| 							'tables'		=> array(), | ||||
| 							'ignore'		=> array(), | ||||
| 							'filename'		=> '', | ||||
| 							'format'		=> 'gzip', // gzip, zip, txt | ||||
| 							'add_drop'		=> TRUE, | ||||
| 							'add_insert'	=> TRUE, | ||||
| 							'newline'		=> "\n" | ||||
| 						); | ||||
|  | ||||
| 		// Did the user submit any preferences? If so set them.... | ||||
| 		if (count($params) > 0) | ||||
| 		{ | ||||
| 			foreach ($prefs as $key => $val) | ||||
| 			{ | ||||
| 				if (isset($params[$key])) | ||||
| 				{ | ||||
| 					$prefs[$key] = $params[$key]; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Are we backing up a complete database or individual tables? | ||||
| 		// If no table names were submitted we'll fetch the entire table list | ||||
| 		if (count($prefs['tables']) == 0) | ||||
| 		{ | ||||
| 			$prefs['tables'] = $this->db->list_tables(); | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Validate the format | ||||
| 		if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) | ||||
| 		{ | ||||
| 			$prefs['format'] = 'txt'; | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Is the encoder supported?  If not, we'll either issue an | ||||
| 		// error or use plain text depending on the debug settings | ||||
| 		if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode')) | ||||
| 		OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress'))) | ||||
| 		{ | ||||
| 			if ($this->db->db_debug) | ||||
| 			{ | ||||
| 				return $this->db->display_error('db_unsuported_compression'); | ||||
| 			} | ||||
|  | ||||
| 			$prefs['format'] = 'txt'; | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Set the filename if not provided - Only needed with Zip files | ||||
| 		if ($prefs['filename'] == '' AND $prefs['format'] == 'zip') | ||||
| 		{ | ||||
| 			$prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database; | ||||
| 			$prefs['filename'] .= '_'.date('Y-m-d_H-i', time()); | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Was a Gzip file requested? | ||||
| 		if ($prefs['format'] == 'gzip') | ||||
| 		{ | ||||
| 			return gzencode($this->_backup($prefs)); | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Was a text file requested? | ||||
| 		if ($prefs['format'] == 'txt') | ||||
| 		{ | ||||
| 			return $this->_backup($prefs); | ||||
| 		} | ||||
|  | ||||
| 		// ------------------------------------------------------ | ||||
|  | ||||
| 		// Was a Zip file requested? | ||||
| 		if ($prefs['format'] == 'zip') | ||||
| 		{ | ||||
| 			// If they included the .zip file extension we'll remove it | ||||
| 			if (preg_match("|.+?\.zip$|", $prefs['filename'])) | ||||
| 			{ | ||||
| 				$prefs['filename'] = str_replace('.zip', '', $prefs['filename']); | ||||
| 			} | ||||
|  | ||||
| 			// Tack on the ".sql" file extension if needed | ||||
| 			if ( ! preg_match("|.+?\.sql$|", $prefs['filename'])) | ||||
| 			{ | ||||
| 				$prefs['filename'] .= '.sql'; | ||||
| 			} | ||||
|  | ||||
| 			// Load the Zip class and output it | ||||
|  | ||||
| 			$CI =& get_instance(); | ||||
| 			$CI->load->library('zip'); | ||||
| 			$CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); | ||||
| 			return $CI->zip->get_zip(); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file DB_utility.php */ | ||||
| /* Location: ./system/database/DB_utility.php */ | ||||
							
								
								
									
										792
									
								
								system/database/drivers/cubrid/cubrid_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										792
									
								
								system/database/drivers/cubrid/cubrid_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,792 @@ | ||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		Esen Sagynov | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.0.2 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CUBRID Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		Esen Sagynov | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_cubrid_driver extends CI_DB { | ||||
|  | ||||
| 	// Default CUBRID Broker port. Will be used unless user | ||||
| 	// explicitly specifies another one. | ||||
| 	const DEFAULT_PORT = 33000; | ||||
|  | ||||
| 	var $dbdriver = 'cubrid'; | ||||
|  | ||||
| 	// The character used for escaping - no need in CUBRID | ||||
| 	var	$_escape_char = ''; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences - not used in CUBRID | ||||
| 	var $_like_escape_str = ''; | ||||
| 	var $_like_escape_chr = ''; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = 'SELECT COUNT(*) AS '; | ||||
| 	var $_random_keyword = ' RAND()'; // database specific random keyword | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		// If no port is defined by the user, use the default value | ||||
| 		if ($this->port == '') | ||||
| 		{ | ||||
| 			$this->port = self::DEFAULT_PORT; | ||||
| 		} | ||||
|  | ||||
| 		$conn = cubrid_connect($this->hostname, $this->port, $this->database, $this->username, $this->password); | ||||
|  | ||||
| 		if ($conn) | ||||
| 		{ | ||||
| 			// Check if a user wants to run queries in dry, i.e. run the | ||||
| 			// queries but not commit them. | ||||
| 			if (isset($this->auto_commit) && ! $this->auto_commit) | ||||
| 			{ | ||||
| 				cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_TRUE); | ||||
| 				$this->auto_commit = TRUE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $conn; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * In CUBRID persistent DB connection is supported natively in CUBRID | ||||
| 	 * engine which can be configured in the CUBRID Broker configuration | ||||
| 	 * file by setting the CCI_PCONNECT parameter to ON. In that case, all | ||||
| 	 * connections established between the client application and the | ||||
| 	 * server will become persistent. This is calling the same | ||||
| 	 * @cubrid_connect function will establish persisten connection | ||||
| 	 * considering that the CCI_PCONNECT is ON. | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		return $this->db_connect(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		if (cubrid_ping($this->conn_id) === FALSE) | ||||
| 		{ | ||||
| 			$this->conn_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		// In CUBRID there is no need to select a database as the database | ||||
| 		// is chosen at the connection time. | ||||
| 		// So, to determine if the database is "selected", all we have to | ||||
| 		// do is ping the server and return that value. | ||||
| 		return cubrid_ping($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// In CUBRID, there is no need to set charset or collation. | ||||
| 		// This is why returning true will allow the application continue | ||||
| 		// its normal process. | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		// To obtain the CUBRID Server version, no need to run the SQL query. | ||||
| 		// CUBRID PHP API provides a function to determin this value. | ||||
| 		// This is why we also need to add 'cubrid' value to the list of | ||||
| 		// $driver_version_exceptions array in DB_driver class in | ||||
| 		// version() function. | ||||
| 		return cubrid_get_server_info($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return @cubrid_query($sql, $this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		// No need to prepare | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		if (cubrid_get_autocommit($this->conn_id)) | ||||
| 		{ | ||||
| 			cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		cubrid_commit($this->conn_id); | ||||
|  | ||||
| 		if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) | ||||
| 		{ | ||||
| 			cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		cubrid_rollback($this->conn_id); | ||||
|  | ||||
| 		if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) | ||||
| 		{ | ||||
| 			cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		if (function_exists('cubrid_real_escape_string') AND is_resource($this->conn_id)) | ||||
| 		{ | ||||
| 			$str = cubrid_real_escape_string($str, $this->conn_id); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = addslashes($str); | ||||
| 		} | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @cubrid_affected_rows($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		return @cubrid_insert_id($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified table | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
| 		 | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SHOW TABLES"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			$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 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT * FROM ".$table." LIMIT 1"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return cubrid_error($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return cubrid_errno($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return '('.implode(', ', $tables).')'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Replace statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific replace string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _replace($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "REPLACE INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert_batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES ".implode(', ', $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = sprintf('"%s" = %s', $key, $val); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Update_Batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific batch update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update_batch($table, $values, $index, $where = NULL) | ||||
| 	{ | ||||
| 		$ids = array(); | ||||
| 		$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; | ||||
|  | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$ids[] = $val[$index]; | ||||
|  | ||||
| 			foreach (array_keys($val) as $field) | ||||
| 			{ | ||||
| 				if ($field != $index) | ||||
| 				{ | ||||
| 					$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET "; | ||||
| 		$cases = ''; | ||||
|  | ||||
| 		foreach ($final as $k => $v) | ||||
| 		{ | ||||
| 			$cases .= $k.' = CASE '."\n"; | ||||
| 			foreach ($v as $row) | ||||
| 			{ | ||||
| 				$cases .= $row."\n"; | ||||
| 			} | ||||
|  | ||||
| 			$cases .= 'ELSE '.$k.' END, '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= substr($cases, 0, -2); | ||||
|  | ||||
| 		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		if ($offset == 0) | ||||
| 		{ | ||||
| 			$offset = ''; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$offset .= ", "; | ||||
| 		} | ||||
|  | ||||
| 		return $sql."LIMIT ".$offset.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@cubrid_close($conn_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file cubrid_driver.php */ | ||||
| /* Location: ./system/database/drivers/cubrid/cubrid_driver.php */ | ||||
							
								
								
									
										288
									
								
								system/database/drivers/cubrid/cubrid_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								system/database/drivers/cubrid/cubrid_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,288 @@ | ||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		Esen Sagynov | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CUBRID Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		Esen Sagynov | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_cubrid_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		// CUBRID does not allow to create a database in SQL. The GUI tools | ||||
| 		// have to be used for this purpose. | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		// CUBRID does not allow to drop a database in SQL. The GUI tools | ||||
| 		// have to be used for this purpose. | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process Fields | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	mixed	the fields | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _process_fields($fields) | ||||
| 	{ | ||||
| 		$current_field_count = 0; | ||||
| 		$sql = ''; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t\"" . $this->db->_protect_identifiers($field) . "\""; | ||||
|  | ||||
| 				if (array_key_exists('NAME', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('TYPE', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' '.$attributes['TYPE']; | ||||
|  | ||||
| 					if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 					{ | ||||
| 						switch ($attributes['TYPE']) | ||||
| 						{ | ||||
| 							case 'decimal': | ||||
| 							case 'float': | ||||
| 							case 'numeric': | ||||
| 								$sql .= '('.implode(',', $attributes['CONSTRAINT']).')'; | ||||
| 								break; | ||||
| 							case 'enum': 	// As of version 8.4.0 CUBRID does not support | ||||
| 											// enum data type. | ||||
| 											break; | ||||
| 							case 'set': | ||||
| 								$sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")'; | ||||
| 								break; | ||||
| 							default: | ||||
| 								$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					//$sql .= ' UNSIGNED'; | ||||
| 					// As of version 8.4.0 CUBRID does not support UNSIGNED INTEGER data type. | ||||
| 					// Will be supported in the next release as a part of MySQL Compatibility. | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNIQUE'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	mixed	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			//$sql .= 'IF NOT EXISTS '; | ||||
| 			// As of version 8.4.0 CUBRID does not support this SQL syntax. | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
|  | ||||
| 		$sql .= $this->_process_fields($fields); | ||||
|  | ||||
| 		// If there is a PK defined | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$key_name = "pk_" . $table . "_" . | ||||
| 				$this->db->_protect_identifiers(implode('_', $primary_keys)); | ||||
| 			 | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tCONSTRAINT " . $key_name . " PRIMARY KEY(" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key_name = $this->db->_protect_identifiers(implode('_', $key)); | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key_name = $this->db->_protect_identifiers($key); | ||||
| 					$key = array($key_name); | ||||
| 				} | ||||
| 				 | ||||
| 				$sql .= ",\n\tKEY \"{$key_name}\" (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n);"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	array	fields | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $fields, $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql.$this->db->_protect_identifiers($fields); | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->_process_fields($fields); | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'RENAME TABLE '.$this->db->_protect_identifiers($table_name)." AS ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file cubrid_forge.php */ | ||||
| /* Location: ./system/database/drivers/cubrid/cubrid_forge.php */ | ||||
							
								
								
									
										202
									
								
								system/database/drivers/cubrid/cubrid_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								system/database/drivers/cubrid/cubrid_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,202 @@ | ||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		Esen Sagynov | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.0.2 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * CUBRID Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		Esen Sagynov | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_cubrid_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @cubrid_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @cubrid_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		return cubrid_column_names($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
|  | ||||
| 		$tablePrimaryKeys = array(); | ||||
|  | ||||
| 		while ($field = cubrid_fetch_field($this->result_id)) | ||||
| 		{ | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= $field->name; | ||||
| 			$F->type		= $field->type; | ||||
| 			$F->default		= $field->def; | ||||
| 			$F->max_length	= $field->max_length; | ||||
|  | ||||
| 			// At this moment primary_key property is not returned when | ||||
| 			// cubrid_fetch_field is called. The following code will | ||||
| 			// provide a patch for it. primary_key property will be added | ||||
| 			// in the next release. | ||||
|  | ||||
| 			// TODO: later version of CUBRID will provide primary_key | ||||
| 			// property. | ||||
| 			// When PK is defined in CUBRID, an index is automatically | ||||
| 			// created in the db_index system table in the form of | ||||
| 			// pk_tblname_fieldname. So the following will count how many | ||||
| 			// columns are there which satisfy this format. | ||||
| 			// The query will search for exact single columns, thus | ||||
| 			// compound PK is not supported. | ||||
| 			$res = cubrid_query($this->conn_id, | ||||
| 				"SELECT COUNT(*) FROM db_index WHERE class_name = '" . $field->table . | ||||
| 				"' AND is_primary_key = 'YES' AND index_name = 'pk_" . | ||||
| 				$field->table . "_" . $field->name . "'" | ||||
| 			); | ||||
|  | ||||
| 			if ($res) | ||||
| 			{ | ||||
| 				$row = cubrid_fetch_array($res, CUBRID_NUM); | ||||
| 				$F->primary_key = ($row[0] > 0 ? 1 : null); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$F->primary_key = null; | ||||
| 			} | ||||
|  | ||||
| 			if (is_resource($res)) | ||||
| 			{ | ||||
| 				cubrid_close_request($res); | ||||
| 				$this->result_id = FALSE; | ||||
| 			} | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if(is_resource($this->result_id) || | ||||
| 			get_resource_type($this->result_id) == "Unknown" && | ||||
| 			preg_match('/Resource id #/', strval($this->result_id))) | ||||
| 		{ | ||||
| 			cubrid_close_request($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset. We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return cubrid_data_seek($this->result_id, $n); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return cubrid_fetch_assoc($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		return cubrid_fetch_object($this->result_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file cubrid_result.php */ | ||||
| /* Location: ./system/database/drivers/cubrid/cubrid_result.php */ | ||||
							
								
								
									
										108
									
								
								system/database/drivers/cubrid/cubrid_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								system/database/drivers/cubrid/cubrid_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | ||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		Esen Sagynov | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CUBRID Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		Esen Sagynov | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_cubrid_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		// CUBRID does not allow to see the list of all databases on the | ||||
| 		// server. It is the way its architecture is designed. Every | ||||
| 		// database is independent and isolated. | ||||
| 		// For this reason we can return only the name of the currect | ||||
| 		// connected database. | ||||
| 		if ($this->conn_id) | ||||
| 		{ | ||||
| 			return "SELECT '" . $this->database . "'"; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 * @link 	http://www.cubrid.org/manual/840/en/Optimize%20Database | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		// No SQL based support in CUBRID as of version 8.4.0. Database or | ||||
| 		// table optimization can be performed using CUBRID Manager | ||||
| 		// database administration tool. See the link above for more info. | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 * @link 	http://www.cubrid.org/manual/840/en/Checking%20Database%20Consistency | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		// Not supported in CUBRID as of version 8.4.0. Database or | ||||
| 		// table consistency can be checked using CUBRID Manager | ||||
| 		// database administration tool. See the link above for more info. | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
| 	/** | ||||
| 	 * CUBRID Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// No SQL based support in CUBRID as of version 8.4.0. Database or | ||||
| 		// table backup can be performed using CUBRID Manager | ||||
| 		// database administration tool. | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file cubrid_utility.php */ | ||||
| /* Location: ./system/database/drivers/cubrid/cubrid_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/cubrid/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/cubrid/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										10
									
								
								system/database/drivers/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										10
									
								
								system/database/drivers/mssql/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/mssql/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										667
									
								
								system/database/drivers/mssql/mssql_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										667
									
								
								system/database/drivers/mssql/mssql_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,667 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MS SQL Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mssql_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'mssql'; | ||||
|  | ||||
| 	// The character used for escaping | ||||
| 	var $_escape_char = ''; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences | ||||
| 	var $_like_escape_str = " ESCAPE '%s' "; | ||||
| 	var $_like_escape_chr = '!'; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword = ' ASC'; // not currently supported | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		if ($this->port != '') | ||||
| 		{ | ||||
| 			$this->hostname .= ','.$this->port; | ||||
| 		} | ||||
|  | ||||
| 		return @mssql_connect($this->hostname, $this->username, $this->password); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		if ($this->port != '') | ||||
| 		{ | ||||
| 			$this->hostname .= ','.$this->port; | ||||
| 		} | ||||
|  | ||||
| 		return @mssql_pconnect($this->hostname, $this->username, $this->password); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		// not implemented in MSSQL | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		// Note: The brackets are required in the event that the DB name | ||||
| 		// contains reserved characters | ||||
| 		return @mssql_select_db('['.$this->database.']', $this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return @mssql_query($sql, $this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		$this->simple_query('BEGIN TRAN'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('COMMIT TRAN'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('ROLLBACK TRAN'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		// Escape single quotes | ||||
| 		$str = str_replace("'", "''", remove_invisible_characters($str)); | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace( | ||||
| 				array($this->_like_escape_chr, '%', '_'), | ||||
| 				array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), | ||||
| 				$str | ||||
| 			); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @mssql_rows_affected($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Insert ID | ||||
| 	* | ||||
| 	* Returns the last id created in the Identity column. | ||||
| 	* | ||||
| 	* @access public | ||||
| 	* @return integer | ||||
| 	*/ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		$ver = self::_parse_major_version($this->version()); | ||||
| 		$sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id"); | ||||
| 		$query = $this->query($sql); | ||||
| 		$row = $query->row(); | ||||
| 		return $row->last_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Parse major version | ||||
| 	* | ||||
| 	* Grabs the major version number from the | ||||
| 	* database server version string passed in. | ||||
| 	* | ||||
| 	* @access private | ||||
| 	* @param string $version | ||||
| 	* @return int16 major version number | ||||
| 	*/ | ||||
| 	function _parse_major_version($version) | ||||
| 	{ | ||||
| 		preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info); | ||||
| 		return $ver_info[1]; // return the major version b/c that's all we're interested in. | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Version number query string | ||||
| 	* | ||||
| 	* @access public | ||||
| 	* @return string | ||||
| 	*/ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return "SELECT @@VERSION AS ver"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; | ||||
|  | ||||
| 		// for future compatibility | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			//$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 			return FALSE; // not currently supported | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT TOP 1 * FROM ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return mssql_get_last_message(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		// Are error numbers supported? | ||||
| 		return ''; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return implode(', ', $tables); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		$i = $limit + $offset; | ||||
|  | ||||
| 		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@mssql_close($conn_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* End of file mssql_driver.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_driver.php */ | ||||
							
								
								
									
										248
									
								
								system/database/drivers/mssql/mssql_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								system/database/drivers/mssql/mssql_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,248 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MS SQL Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mssql_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		return "CREATE DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		return "DROP DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return "DROP TABLE ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n)"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		// I think this syntax will work, but can find little documentation on renaming tables in MSSQL | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file mssql_forge.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_forge.php */ | ||||
							
								
								
									
										169
									
								
								system/database/drivers/mssql/mssql_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								system/database/drivers/mssql/mssql_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,169 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MS SQL Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mssql_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @mssql_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @mssql_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		while ($field = mssql_fetch_field($this->result_id)) | ||||
| 		{ | ||||
| 			$field_names[] = $field->name; | ||||
| 		} | ||||
|  | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		while ($field = mssql_fetch_field($this->result_id)) | ||||
| 		{ | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= $field->name; | ||||
| 			$F->type		= $field->type; | ||||
| 			$F->max_length	= $field->max_length; | ||||
| 			$F->primary_key = 0; | ||||
| 			$F->default		= ''; | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_resource($this->result_id)) | ||||
| 		{ | ||||
| 			mssql_free_result($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return mssql_data_seek($this->result_id, $n); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return mssql_fetch_assoc($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		return mssql_fetch_object($this->result_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file mssql_result.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_result.php */ | ||||
							
								
								
									
										88
									
								
								system/database/drivers/mssql/mssql_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								system/database/drivers/mssql/mssql_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MS SQL Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mssql_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return FALSE; // Is this supported in MS SQL? | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return FALSE; // Is this supported in MS SQL? | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * MSSQL Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file mssql_utility.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/mysql/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/mysql/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										779
									
								
								system/database/drivers/mysql/mysql_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										779
									
								
								system/database/drivers/mysql/mysql_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,779 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQL Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysql_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'mysql'; | ||||
|  | ||||
| 	// The character used for escaping | ||||
| 	var	$_escape_char = '`'; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences - not used in MySQL | ||||
| 	var $_like_escape_str = ''; | ||||
| 	var $_like_escape_chr = ''; | ||||
|  | ||||
| 	/** | ||||
| 	 * Whether to use the MySQL "delete hack" which allows the number | ||||
| 	 * of affected rows to be shown. Uses a preg_replace when enabled, | ||||
| 	 * adding a bit more processing to all queries. | ||||
| 	 */ | ||||
| 	var $delete_hack = TRUE; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = 'SELECT COUNT(*) AS '; | ||||
| 	var $_random_keyword = ' RAND()'; // database specific random keyword | ||||
|  | ||||
| 	// whether SET NAMES must be used to set the character set | ||||
| 	var $use_set_names; | ||||
| 	 | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		if ($this->port != '') | ||||
| 		{ | ||||
| 			$this->hostname .= ':'.$this->port; | ||||
| 		} | ||||
|  | ||||
| 		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		if ($this->port != '') | ||||
| 		{ | ||||
| 			$this->hostname .= ':'.$this->port; | ||||
| 		} | ||||
|  | ||||
| 		return @mysql_pconnect($this->hostname, $this->username, $this->password); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		if (mysql_ping($this->conn_id) === FALSE) | ||||
| 		{ | ||||
| 			$this->conn_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		return @mysql_select_db($this->database, $this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		if ( ! isset($this->use_set_names)) | ||||
| 		{ | ||||
| 			// mysql_set_charset() requires PHP >= 5.2.3 and MySQL >= 5.0.7, use SET NAMES as fallback | ||||
| 			$this->use_set_names = (version_compare(PHP_VERSION, '5.2.3', '>=') && version_compare(mysql_get_server_info(), '5.0.7', '>=')) ? FALSE : TRUE; | ||||
| 		} | ||||
|  | ||||
| 		if ($this->use_set_names === TRUE) | ||||
| 		{ | ||||
| 			return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return @mysql_set_charset($charset, $this->conn_id); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return "SELECT version() AS ver"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return @mysql_query($sql, $this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies | ||||
| 		// the query so that it returns the number of affected rows | ||||
| 		if ($this->delete_hack === TRUE) | ||||
| 		{ | ||||
| 			if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) | ||||
| 			{ | ||||
| 				$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		$this->simple_query('SET AUTOCOMMIT=0'); | ||||
| 		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('COMMIT'); | ||||
| 		$this->simple_query('SET AUTOCOMMIT=1'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('ROLLBACK'); | ||||
| 		$this->simple_query('SET AUTOCOMMIT=1'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 	   		{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 	   		} | ||||
|  | ||||
| 	   		return $str; | ||||
| 	   	} | ||||
|  | ||||
| 		if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) | ||||
| 		{ | ||||
| 			$str = mysql_real_escape_string($str, $this->conn_id); | ||||
| 		} | ||||
| 		elseif (function_exists('mysql_escape_string')) | ||||
| 		{ | ||||
| 			$str = mysql_escape_string($str); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = addslashes($str); | ||||
| 		} | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @mysql_affected_rows($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		return @mysql_insert_id($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			$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 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "DESCRIBE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return mysql_error($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return mysql_errno($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return '('.implode(', ', $tables).')'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Replace statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific replace string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _replace($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert_batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key . ' = ' . $val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Update_Batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific batch update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update_batch($table, $values, $index, $where = NULL) | ||||
| 	{ | ||||
| 		$ids = array(); | ||||
| 		$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; | ||||
|  | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$ids[] = $val[$index]; | ||||
|  | ||||
| 			foreach (array_keys($val) as $field) | ||||
| 			{ | ||||
| 				if ($field != $index) | ||||
| 				{ | ||||
| 					$final[$field][] =  'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET "; | ||||
| 		$cases = ''; | ||||
|  | ||||
| 		foreach ($final as $k => $v) | ||||
| 		{ | ||||
| 			$cases .= $k.' = CASE '."\n"; | ||||
| 			foreach ($v as $row) | ||||
| 			{ | ||||
| 				$cases .= $row."\n"; | ||||
| 			} | ||||
|  | ||||
| 			$cases .= 'ELSE '.$k.' END, '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= substr($cases, 0, -2); | ||||
|  | ||||
| 		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		if ($offset == 0) | ||||
| 		{ | ||||
| 			$offset = ''; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$offset .= ", "; | ||||
| 		} | ||||
|  | ||||
| 		return $sql."LIMIT ".$offset.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@mysql_close($conn_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file mysql_driver.php */ | ||||
| /* Location: ./system/database/drivers/mysql/mysql_driver.php */ | ||||
							
								
								
									
										273
									
								
								system/database/drivers/mysql/mysql_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										273
									
								
								system/database/drivers/mysql/mysql_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,273 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQL Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysql_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		return "CREATE DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		return "DROP DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process Fields | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	mixed	the fields | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _process_fields($fields) | ||||
| 	{ | ||||
| 		$current_field_count = 0; | ||||
| 		$sql = ''; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				if (array_key_exists('NAME', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('TYPE', $attributes)) | ||||
| 				{ | ||||
| 					$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 					if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 					{ | ||||
| 						switch ($attributes['TYPE']) | ||||
| 						{ | ||||
| 							case 'decimal': | ||||
| 							case 'float': | ||||
| 							case 'numeric': | ||||
| 								$sql .= '('.implode(',', $attributes['CONSTRAINT']).')'; | ||||
| 							break; | ||||
|  | ||||
| 							case 'enum': | ||||
| 							case 'set': | ||||
| 								$sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")'; | ||||
| 							break; | ||||
|  | ||||
| 							default: | ||||
| 								$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	mixed	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
|  | ||||
| 		$sql .= $this->_process_fields($fields); | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key_name = $this->db->_protect_identifiers(implode('_', $key)); | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key_name = $this->db->_protect_identifiers($key); | ||||
| 					$key = array($key_name); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	array	fields | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $fields, $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql.$this->db->_protect_identifiers($fields); | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->_process_fields($fields); | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file mysql_forge.php */ | ||||
| /* Location: ./system/database/drivers/mysql/mysql_forge.php */ | ||||
							
								
								
									
										174
									
								
								system/database/drivers/mysql/mysql_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								system/database/drivers/mysql/mysql_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * MySQL Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysql_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @mysql_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @mysql_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		while ($field = mysql_fetch_field($this->result_id)) | ||||
| 		{ | ||||
| 			$field_names[] = $field->name; | ||||
| 		} | ||||
|  | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		while ($field = mysql_fetch_object($this->result_id)) | ||||
| 		{ | ||||
| 			preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); | ||||
|  | ||||
| 			$type = (array_key_exists(1, $matches)) ? $matches[1] : NULL; | ||||
| 			$length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; | ||||
|  | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= $field->Field; | ||||
| 			$F->type		= $type; | ||||
| 			$F->default		= $field->Default; | ||||
| 			$F->max_length	= $length; | ||||
| 			$F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 ); | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_resource($this->result_id)) | ||||
| 		{ | ||||
| 			mysql_free_result($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return mysql_data_seek($this->result_id, $n); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return mysql_fetch_assoc($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		return mysql_fetch_object($this->result_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file mysql_result.php */ | ||||
| /* Location: ./system/database/drivers/mysql/mysql_result.php */ | ||||
							
								
								
									
										210
									
								
								system/database/drivers/mysql/mysql_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								system/database/drivers/mysql/mysql_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQL Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysql_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		return "SHOW DATABASES"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return "REPAIR TABLE ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
| 	/** | ||||
| 	 * MySQL Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		if (count($params) == 0) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// Extract the prefs for simplicity | ||||
| 		extract($params); | ||||
|  | ||||
| 		// Build the output | ||||
| 		$output = ''; | ||||
| 		foreach ((array)$tables as $table) | ||||
| 		{ | ||||
| 			// Is the table in the "ignore" list? | ||||
| 			if (in_array($table, (array)$ignore, TRUE)) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			// Get the table schema | ||||
| 			$query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.`'.$table.'`'); | ||||
|  | ||||
| 			// No result means the table name was invalid | ||||
| 			if ($query === FALSE) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			// Write out the table schema | ||||
| 			$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; | ||||
|  | ||||
| 			if ($add_drop == TRUE) | ||||
| 			{ | ||||
| 				$output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline; | ||||
| 			} | ||||
|  | ||||
| 			$i = 0; | ||||
| 			$result = $query->result_array(); | ||||
| 			foreach ($result[0] as $val) | ||||
| 			{ | ||||
| 				if ($i++ % 2) | ||||
| 				{ | ||||
| 					$output .= $val.';'.$newline.$newline; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// If inserts are not needed we're done... | ||||
| 			if ($add_insert == FALSE) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			// Grab all the data from the current table | ||||
| 			$query = $this->db->query("SELECT * FROM $table"); | ||||
|  | ||||
| 			if ($query->num_rows() == 0) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			// Fetch the field names and determine if the field is an | ||||
| 			// integer type.  We use this info to decide whether to | ||||
| 			// surround the data with quotes or not | ||||
|  | ||||
| 			$i = 0; | ||||
| 			$field_str = ''; | ||||
| 			$is_int = array(); | ||||
| 			while ($field = mysql_fetch_field($query->result_id)) | ||||
| 			{ | ||||
| 				// Most versions of MySQL store timestamp as a string | ||||
| 				$is_int[$i] = (in_array( | ||||
| 										strtolower(mysql_field_type($query->result_id, $i)), | ||||
| 										array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), | ||||
| 										TRUE) | ||||
| 										) ? TRUE : FALSE; | ||||
|  | ||||
| 				// Create a string of field names | ||||
| 				$field_str .= '`'.$field->name.'`, '; | ||||
| 				$i++; | ||||
| 			} | ||||
|  | ||||
| 			// Trim off the end comma | ||||
| 			$field_str = preg_replace( "/, $/" , "" , $field_str); | ||||
|  | ||||
|  | ||||
| 			// Build the insert string | ||||
| 			foreach ($query->result_array() as $row) | ||||
| 			{ | ||||
| 				$val_str = ''; | ||||
|  | ||||
| 				$i = 0; | ||||
| 				foreach ($row as $v) | ||||
| 				{ | ||||
| 					// Is the value NULL? | ||||
| 					if ($v === NULL) | ||||
| 					{ | ||||
| 						$val_str .= 'NULL'; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						// Escape the data if it's not an integer | ||||
| 						if ($is_int[$i] == FALSE) | ||||
| 						{ | ||||
| 							$val_str .= $this->db->escape($v); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							$val_str .= $v; | ||||
| 						} | ||||
| 					} | ||||
|  | ||||
| 					// Append a comma | ||||
| 					$val_str .= ', '; | ||||
| 					$i++; | ||||
| 				} | ||||
|  | ||||
| 				// Remove the comma at the end of the string | ||||
| 				$val_str = preg_replace( "/, $/" , "" , $val_str); | ||||
|  | ||||
| 				// Build the INSERT string | ||||
| 				$output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline; | ||||
| 			} | ||||
|  | ||||
| 			$output .= $newline.$newline; | ||||
| 		} | ||||
|  | ||||
| 		return $output; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file mysql_utility.php */ | ||||
| /* Location: ./system/database/drivers/mysql/mysql_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/mysqli/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/mysqli/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										776
									
								
								system/database/drivers/mysqli/mysqli_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										776
									
								
								system/database/drivers/mysqli/mysqli_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,776 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQLi Database Adapter Class - MySQLi only works with PHP 5 | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysqli_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'mysqli'; | ||||
|  | ||||
| 	// The character used for escaping | ||||
| 	var $_escape_char = '`'; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences - not used in MySQL | ||||
| 	var $_like_escape_str = ''; | ||||
| 	var $_like_escape_chr = ''; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword = ' RAND()'; // database specific random keyword | ||||
|  | ||||
| 	/** | ||||
| 	 * Whether to use the MySQL "delete hack" which allows the number | ||||
| 	 * of affected rows to be shown. Uses a preg_replace when enabled, | ||||
| 	 * adding a bit more processing to all queries. | ||||
| 	 */ | ||||
| 	var $delete_hack = TRUE; | ||||
|  | ||||
| 	// whether SET NAMES must be used to set the character set | ||||
| 	var $use_set_names; | ||||
| 	 | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		if ($this->port != '') | ||||
| 		{ | ||||
| 			return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		return $this->db_connect(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		if (mysqli_ping($this->conn_id) === FALSE) | ||||
| 		{ | ||||
| 			$this->conn_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		return @mysqli_select_db($this->conn_id, $this->database); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		if ( ! isset($this->use_set_names)) | ||||
| 		{ | ||||
| 			// mysqli_set_charset() requires MySQL >= 5.0.7, use SET NAMES as fallback | ||||
| 			$this->use_set_names = (version_compare(mysqli_get_server_info($this->conn_id), '5.0.7', '>=')) ? FALSE : TRUE; | ||||
| 		} | ||||
|  | ||||
| 		if ($this->use_set_names === TRUE) | ||||
| 		{ | ||||
| 			return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'"); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return @mysqli_set_charset($this->conn_id, $charset); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return "SELECT version() AS ver"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		$result = @mysqli_query($this->conn_id, $sql); | ||||
| 		return $result; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies | ||||
| 		// the query so that it returns the number of affected rows | ||||
| 		if ($this->delete_hack === TRUE) | ||||
| 		{ | ||||
| 			if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) | ||||
| 			{ | ||||
| 				$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		$this->simple_query('SET AUTOCOMMIT=0'); | ||||
| 		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('COMMIT'); | ||||
| 		$this->simple_query('SET AUTOCOMMIT=1'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('ROLLBACK'); | ||||
| 		$this->simple_query('SET AUTOCOMMIT=1'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id)) | ||||
| 		{ | ||||
| 			$str = mysqli_real_escape_string($this->conn_id, $str); | ||||
| 		} | ||||
| 		elseif (function_exists('mysql_escape_string')) | ||||
| 		{ | ||||
| 			$str = mysql_escape_string($str); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = addslashes($str); | ||||
| 		} | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @mysqli_affected_rows($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		return @mysqli_insert_id($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			$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 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "DESCRIBE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return mysqli_error($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return mysqli_errno($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return '('.implode(', ', $tables).')'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert_batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Replace statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific replace string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _replace($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update_Batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific batch update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update_batch($table, $values, $index, $where = NULL) | ||||
| 	{ | ||||
| 		$ids = array(); | ||||
| 		$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; | ||||
|  | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$ids[] = $val[$index]; | ||||
|  | ||||
| 			foreach (array_keys($val) as $field) | ||||
| 			{ | ||||
| 				if ($field != $index) | ||||
| 				{ | ||||
| 					$final[$field][] =  'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET "; | ||||
| 		$cases = ''; | ||||
|  | ||||
| 		foreach ($final as $k => $v) | ||||
| 		{ | ||||
| 			$cases .= $k.' = CASE '."\n"; | ||||
| 			foreach ($v as $row) | ||||
| 			{ | ||||
| 				$cases .= $row."\n"; | ||||
| 			} | ||||
|  | ||||
| 			$cases .= 'ELSE '.$k.' END, '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= substr($cases, 0, -2); | ||||
|  | ||||
| 		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		$sql .= "LIMIT ".$limit; | ||||
|  | ||||
| 		if ($offset > 0) | ||||
| 		{ | ||||
| 			$sql .= " OFFSET ".$offset; | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@mysqli_close($conn_id); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file mysqli_driver.php */ | ||||
| /* Location: ./system/database/drivers/mysqli/mysqli_driver.php */ | ||||
							
								
								
									
										258
									
								
								system/database/drivers/mysqli/mysqli_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								system/database/drivers/mysqli/mysqli_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,258 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQLi Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysqli_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		return "CREATE DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		return "DROP DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Process Fields | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	mixed	the fields | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _process_fields($fields) | ||||
| 	{ | ||||
| 		$current_field_count = 0; | ||||
| 		$sql = ''; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				if (array_key_exists('NAME', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('TYPE', $attributes)) | ||||
| 				{ | ||||
| 					$sql .=  ' '.$attributes['TYPE']; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	mixed	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
|  | ||||
| 		$sql .= $this->_process_fields($fields); | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key_name = $this->db->_protect_identifiers(implode('_', $key)); | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key_name = $this->db->_protect_identifiers($key); | ||||
| 					$key = array($key_name); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	array	fields | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $fields, $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql.$this->db->_protect_identifiers($fields); | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->_process_fields($fields); | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file mysqli_forge.php */ | ||||
| /* Location: ./system/database/drivers/mysqli/mysqli_forge.php */ | ||||
							
								
								
									
										174
									
								
								system/database/drivers/mysqli/mysqli_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								system/database/drivers/mysqli/mysqli_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQLi Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysqli_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @mysqli_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @mysqli_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		while ($field = mysqli_fetch_field($this->result_id)) | ||||
| 		{ | ||||
| 			$field_names[] = $field->name; | ||||
| 		} | ||||
|  | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		while ($field = mysqli_fetch_object($this->result_id)) | ||||
| 		{ | ||||
| 			preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); | ||||
|  | ||||
| 			$type = (array_key_exists(1, $matches)) ? $matches[1] : NULL; | ||||
| 			$length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; | ||||
|  | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= $field->Field; | ||||
| 			$F->type		= $type; | ||||
| 			$F->default		= $field->Default; | ||||
| 			$F->max_length	= $length; | ||||
| 			$F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 ); | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_object($this->result_id)) | ||||
| 		{ | ||||
| 			mysqli_free_result($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return mysqli_data_seek($this->result_id, $n); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return mysqli_fetch_assoc($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		return mysqli_fetch_object($this->result_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file mysqli_result.php */ | ||||
| /* Location: ./system/database/drivers/mysqli/mysqli_result.php */ | ||||
							
								
								
									
										87
									
								
								system/database/drivers/mysqli/mysqli_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								system/database/drivers/mysqli/mysqli_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * MySQLi Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_mysqli_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		return "SHOW DATABASES"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return "REPAIR TABLE ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * MySQLi Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file mysqli_utility.php */ | ||||
| /* Location: ./system/database/drivers/mysqli/mysqli_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/oci8/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/oci8/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										808
									
								
								system/database/drivers/oci8/oci8_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										808
									
								
								system/database/drivers/oci8/oci8_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,808 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright   Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * oci8 Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage  Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * oci8 Database Adapter Class | ||||
|  * | ||||
|  * This is a modification of the DB_driver class to | ||||
|  * permit access to oracle databases | ||||
|  * | ||||
|  * @author	  Kelly McArdle | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| class CI_DB_oci8_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'oci8'; | ||||
|  | ||||
| 	// The character used for excaping | ||||
| 	var $_escape_char = '"'; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences | ||||
| 	var $_like_escape_str = " escape '%s' "; | ||||
| 	var $_like_escape_chr = '!'; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(1) AS "; | ||||
| 	var $_random_keyword = ' ASC'; // not currently supported | ||||
|  | ||||
| 	// Set "auto commit" by default | ||||
| 	var $_commit = OCI_COMMIT_ON_SUCCESS; | ||||
|  | ||||
| 	// need to track statement id and cursor id | ||||
| 	var $stmt_id; | ||||
| 	var $curs_id; | ||||
|  | ||||
| 	// if we use a limit, we will add a field that will | ||||
| 	// throw off num_fields later | ||||
| 	var $limit_used; | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access  private called by the base class | ||||
| 	 * @return  resource | ||||
| 	 */ | ||||
| 	public function db_connect() | ||||
| 	{ | ||||
| 		return @oci_connect($this->username, $this->password, $this->hostname, $this->char_set); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access  private called by the base class | ||||
| 	 * @return  resource | ||||
| 	 */ | ||||
| 	public function db_pconnect() | ||||
| 	{ | ||||
| 		return @oci_pconnect($this->username, $this->password, $this->hostname, $this->char_set); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	public function reconnect() | ||||
| 	{ | ||||
| 		// not implemented in oracle | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access  private called by the base class | ||||
| 	 * @return  resource | ||||
| 	 */ | ||||
| 	public function db_select() | ||||
| 	{ | ||||
| 		// Not in Oracle - schemas are actually usernames | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	public function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	protected function _version() | ||||
| 	{ | ||||
| 		return oci_server_version($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access  protected  called by the base class | ||||
| 	 * @param   string  an SQL query | ||||
| 	 * @return  resource | ||||
| 	 */ | ||||
| 	protected function _execute($sql) | ||||
| 	{ | ||||
| 		// oracle must parse the query before it is run. All of the actions with | ||||
| 		// the query are based on the statement id returned by ociparse | ||||
| 		$this->stmt_id = FALSE; | ||||
| 		$this->_set_stmt_id($sql); | ||||
| 		oci_set_prefetch($this->stmt_id, 1000); | ||||
| 		return @oci_execute($this->stmt_id, $this->_commit); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Generate a statement ID | ||||
| 	 * | ||||
| 	 * @access  private | ||||
| 	 * @param   string  an SQL query | ||||
| 	 * @return  none | ||||
| 	 */ | ||||
| 	private function _set_stmt_id($sql) | ||||
| 	{ | ||||
| 		if ( ! is_resource($this->stmt_id)) | ||||
| 		{ | ||||
| 			$this->stmt_id = oci_parse($this->conn_id, $this->_prep_query($sql)); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access  private called by execute() | ||||
| 	 * @param   string  an SQL query | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	private function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * getCursor.  Returns a cursor from the datbase | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @return  cursor id | ||||
| 	 */ | ||||
| 	public function get_cursor() | ||||
| 	{ | ||||
| 		$this->curs_id = oci_new_cursor($this->conn_id); | ||||
| 		return $this->curs_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Stored Procedure.  Executes a stored procedure | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   package	 package stored procedure is in | ||||
| 	 * @param   procedure   stored procedure to execute | ||||
| 	 * @param   params	  array of parameters | ||||
| 	 * @return  array | ||||
| 	 * | ||||
| 	 * params array keys | ||||
| 	 * | ||||
| 	 * KEY	  OPTIONAL	NOTES | ||||
| 	 * name		no		the name of the parameter should be in :<param_name> format | ||||
| 	 * value	no		the value of the parameter.  If this is an OUT or IN OUT parameter, | ||||
| 	 *					this should be a reference to a variable | ||||
| 	 * type		yes		the type of the parameter | ||||
| 	 * length	yes		the max size of the parameter | ||||
| 	 */ | ||||
| 	public function stored_procedure($package, $procedure, $params) | ||||
| 	{ | ||||
| 		if ($package == '' OR $procedure == '' OR ! is_array($params)) | ||||
| 		{ | ||||
| 			if ($this->db_debug) | ||||
| 			{ | ||||
| 				log_message('error', 'Invalid query: '.$package.'.'.$procedure); | ||||
| 				return $this->display_error('db_invalid_query'); | ||||
| 			} | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// build the query string | ||||
| 		$sql = "begin $package.$procedure("; | ||||
|  | ||||
| 		$have_cursor = FALSE; | ||||
| 		foreach ($params as $param) | ||||
| 		{ | ||||
| 			$sql .= $param['name'] . ","; | ||||
|  | ||||
| 			if (array_key_exists('type', $param) && ($param['type'] === OCI_B_CURSOR)) | ||||
| 			{ | ||||
| 				$have_cursor = TRUE; | ||||
| 			} | ||||
| 		} | ||||
| 		$sql = trim($sql, ",") . "); end;"; | ||||
|  | ||||
| 		$this->stmt_id = FALSE; | ||||
| 		$this->_set_stmt_id($sql); | ||||
| 		$this->_bind_params($params); | ||||
| 		$this->query($sql, FALSE, $have_cursor); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Bind parameters | ||||
| 	 * | ||||
| 	 * @access  private | ||||
| 	 * @return  none | ||||
| 	 */ | ||||
| 	private function _bind_params($params) | ||||
| 	{ | ||||
| 		if ( ! is_array($params) OR ! is_resource($this->stmt_id)) | ||||
| 		{ | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($params as $param) | ||||
| 		{ | ||||
| 			foreach (array('name', 'value', 'type', 'length') as $val) | ||||
| 			{ | ||||
| 				if ( ! isset($param[$val])) | ||||
| 				{ | ||||
| 					$param[$val] = ''; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		$this->_commit = OCI_DEFAULT; | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$ret = oci_commit($this->conn_id); | ||||
| 		$this->_commit = OCI_COMMIT_ON_SUCCESS; | ||||
| 		return $ret; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	public function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$ret = oci_rollback($this->conn_id); | ||||
| 		$this->_commit = OCI_COMMIT_ON_SUCCESS; | ||||
| 		return $ret; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	public function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$str = remove_invisible_characters($str); | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(	array('%', '_', $this->_like_escape_chr), | ||||
| 								array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), | ||||
| 								$str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @return  integer | ||||
| 	 */ | ||||
| 	public function affected_rows() | ||||
| 	{ | ||||
| 		return @oci_num_rows($this->stmt_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @return  integer | ||||
| 	 */ | ||||
| 	public function insert_id() | ||||
| 	{ | ||||
| 		// not supported in oracle | ||||
| 		return $this->display_error('db_unsupported_function'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   string | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	public function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query == FALSE) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SELECT TABLE_NAME FROM ALL_TABLES"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			$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 | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @param   string  the table name | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	protected function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   string  the table name | ||||
| 	 * @return  object | ||||
| 	 */ | ||||
| 	protected function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT * FROM ".$table." where rownum = 1"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	protected function _error_message() | ||||
| 	{ | ||||
| 		// If the error was during connection, no conn_id should be passed | ||||
| 		$error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error(); | ||||
| 		return $error['message']; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @return  integer | ||||
| 	 */ | ||||
| 	protected function _error_number() | ||||
| 	{ | ||||
| 		// Same as _error_message() | ||||
| 		$error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error(); | ||||
| 		return $error['code']; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	protected function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return implode(', ', $tables); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   string  the table name | ||||
| 	 * @param   array   the insert keys | ||||
| 	 * @param   array   the insert values | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	protected function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert_batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access      protected | ||||
| 	 * @param       string  the table name | ||||
| 	 * @param       array   the insert keys | ||||
| 	 * @param       array   the 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"; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= 'SELECT * FROM dual'; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE TABLE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	protected function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @param   string  the sql query string | ||||
| 	 * @param   integer the number of rows to limit the query to | ||||
| 	 * @param   integer the offset value | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	protected function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		$limit = $offset + $limit; | ||||
| 		$newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)"; | ||||
|  | ||||
| 		if ($offset != 0) | ||||
| 		{ | ||||
| 			$newsql .= " WHERE rnum >= $offset"; | ||||
| 		} | ||||
|  | ||||
| 		// remember that we used limits | ||||
| 		$this->limit_used = TRUE; | ||||
|  | ||||
| 		return $newsql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @param   resource | ||||
| 	 * @return  void | ||||
| 	 */ | ||||
| 	protected function _close($conn_id) | ||||
| 	{ | ||||
| 		@oci_close($conn_id); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* End of file oci8_driver.php */ | ||||
| /* Location: ./system/database/drivers/oci8/oci8_driver.php */ | ||||
							
								
								
									
										248
									
								
								system/database/drivers/oci8/oci8_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								system/database/drivers/oci8/oci8_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,248 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Oracle Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_oci8_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n)"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file oci8_forge.php */ | ||||
| /* Location: ./system/database/drivers/oci8/oci8_forge.php */ | ||||
							
								
								
									
										217
									
								
								system/database/drivers/oci8/oci8_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								system/database/drivers/oci8/oci8_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,217 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright   Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * oci8 Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_oci8_result extends CI_DB_result { | ||||
|  | ||||
| 	public $stmt_id; | ||||
| 	public $curs_id; | ||||
| 	public $limit_used; | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set. | ||||
| 	 * | ||||
| 	 * Oracle doesn't have a graceful way to retun the number of rows | ||||
| 	 * so we have to use what amounts to a hack. | ||||
| 	 * | ||||
| 	 * @return  integer | ||||
| 	 */ | ||||
| 	public function num_rows() | ||||
| 	{ | ||||
| 		if ($this->num_rows === 0 && count($this->result_array()) > 0) | ||||
| 		{ | ||||
| 			$this->num_rows = count($this->result_array()); | ||||
| 			@oci_execute($this->stmt_id); | ||||
|  | ||||
| 			if ($this->curs_id) | ||||
| 			{ | ||||
| 				@oci_execute($this->curs_id); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $this->num_rows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @return  integer | ||||
| 	 */ | ||||
| 	public function num_fields() | ||||
| 	{ | ||||
| 		$count = @oci_num_fields($this->stmt_id); | ||||
|  | ||||
| 		// if we used a limit we subtract it | ||||
| 		if ($this->limit_used) | ||||
| 		{ | ||||
| 			$count = $count - 1; | ||||
| 		} | ||||
|  | ||||
| 		return $count; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	public function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) | ||||
| 		{ | ||||
| 			$field_names[] = oci_field_name($this->stmt_id, $c); | ||||
| 		} | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @return  array | ||||
| 	 */ | ||||
| 	public function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) | ||||
| 		{ | ||||
| 			$F			= new stdClass(); | ||||
| 			$F->name		= oci_field_name($this->stmt_id, $c); | ||||
| 			$F->type		= oci_field_type($this->stmt_id, $c); | ||||
| 			$F->max_length		= oci_field_size($this->stmt_id, $c); | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	public function free_result() | ||||
| 	{ | ||||
| 		if (is_resource($this->result_id)) | ||||
| 		{ | ||||
| 			oci_free_statement($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @return  array | ||||
| 	 */ | ||||
| 	protected function _fetch_assoc() | ||||
| 	{ | ||||
| 		$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; | ||||
| 		return oci_fetch_assoc($id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access  protected | ||||
| 	 * @return  object | ||||
| 	 */ | ||||
| 	protected function _fetch_object() | ||||
| 	{ | ||||
| 		$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; | ||||
| 		return @oci_fetch_object($id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Query result.  "array" version. | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @return  array | ||||
| 	 */ | ||||
| 	public function result_array() | ||||
| 	{ | ||||
| 		if (count($this->result_array) > 0) | ||||
| 		{ | ||||
| 			return $this->result_array; | ||||
| 		} | ||||
|  | ||||
| 		$row = NULL; | ||||
| 		while ($row = $this->_fetch_assoc()) | ||||
| 		{ | ||||
| 			$this->result_array[] = $row; | ||||
| 		} | ||||
|  | ||||
| 		return $this->result_array; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	protected | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	protected function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return FALSE; // Not needed | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file oci8_result.php */ | ||||
| /* Location: ./system/database/drivers/oci8/oci8_result.php */ | ||||
							
								
								
									
										87
									
								
								system/database/drivers/oci8/oci8_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								system/database/drivers/oci8/oci8_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Oracle Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_oci8_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return FALSE; // Is this supported in Oracle? | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return FALSE; // Is this supported in Oracle? | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Oracle Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file oci8_utility.php */ | ||||
| /* Location: ./system/database/drivers/oci8/oci8_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/odbc/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/odbc/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										637
									
								
								system/database/drivers/odbc/odbc_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										637
									
								
								system/database/drivers/odbc/odbc_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,637 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * ODBC Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_odbc_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'odbc'; | ||||
|  | ||||
| 	// the character used to excape - not necessary for ODBC | ||||
| 	var $_escape_char = ''; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences | ||||
| 	var $_like_escape_str = " {escape '%s'} "; | ||||
| 	var $_like_escape_chr = '!'; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword; | ||||
|  | ||||
|  | ||||
| 	function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		$this->_random_keyword = ' RND('.time().')'; // database specific random keyword | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		return @odbc_connect($this->hostname, $this->username, $this->password); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		return @odbc_pconnect($this->hostname, $this->username, $this->password); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		// not implemented in odbc | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		// Not needed for ODBC | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return "SELECT version() AS ver"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return @odbc_exec($this->conn_id, $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		return odbc_autocommit($this->conn_id, FALSE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$ret = odbc_commit($this->conn_id); | ||||
| 		odbc_autocommit($this->conn_id, TRUE); | ||||
| 		return $ret; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$ret = odbc_rollback($this->conn_id); | ||||
| 		odbc_autocommit($this->conn_id, TRUE); | ||||
| 		return $ret; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		// ODBC doesn't require escaping | ||||
| 		$str = remove_invisible_characters($str); | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(	array('%', '_', $this->_like_escape_chr), | ||||
| 								array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), | ||||
| 								$str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @odbc_num_rows($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		return @odbc_insert_id($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SHOW TABLES FROM `".$this->database."`"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			//$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 			return FALSE; // not currently supported | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SHOW COLUMNS FROM ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT TOP 1 FROM ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return odbc_errormsg($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return odbc_error($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return '('.implode(', ', $tables).')'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return $this->_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		// Does ODBC doesn't use the LIMIT clause? | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@odbc_close($conn_id); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* End of file odbc_driver.php */ | ||||
| /* Location: ./system/database/drivers/odbc/odbc_driver.php */ | ||||
							
								
								
									
										266
									
								
								system/database/drivers/odbc/odbc_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								system/database/drivers/odbc/odbc_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,266 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * ODBC Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/database/ | ||||
|  */ | ||||
| class CI_DB_odbc_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database() | ||||
| 	{ | ||||
| 		// ODBC has no "create database" command since it's | ||||
| 		// designed to connect to an existing database | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		// ODBC has no "drop database" command since it's | ||||
| 		// designed to connect to an existing database | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n)"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		// Not a supported ODBC feature | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file odbc_forge.php */ | ||||
| /* Location: ./system/database/drivers/odbc/odbc_forge.php */ | ||||
							
								
								
									
										228
									
								
								system/database/drivers/odbc/odbc_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										228
									
								
								system/database/drivers/odbc/odbc_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,228 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * ODBC Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_odbc_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @odbc_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @odbc_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		for ($i = 0; $i < $this->num_fields(); $i++) | ||||
| 		{ | ||||
| 			$field_names[]	= odbc_field_name($this->result_id, $i); | ||||
| 		} | ||||
|  | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0; $i < $this->num_fields(); $i++) | ||||
| 		{ | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= odbc_field_name($this->result_id, $i); | ||||
| 			$F->type		= odbc_field_type($this->result_id, $i); | ||||
| 			$F->max_length	= odbc_field_len($this->result_id, $i); | ||||
| 			$F->primary_key = 0; | ||||
| 			$F->default		= ''; | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_resource($this->result_id)) | ||||
| 		{ | ||||
| 			odbc_free_result($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		if (function_exists('odbc_fetch_object')) | ||||
| 		{ | ||||
| 			return odbc_fetch_array($this->result_id); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return $this->_odbc_fetch_array($this->result_id); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		if (function_exists('odbc_fetch_object')) | ||||
| 		{ | ||||
| 			return odbc_fetch_object($this->result_id); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return $this->_odbc_fetch_object($this->result_id); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * subsititutes the odbc_fetch_object function when | ||||
| 	 * not available (odbc_fetch_object requires unixODBC) | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _odbc_fetch_object(& $odbc_result) { | ||||
| 		$rs = array(); | ||||
| 		$rs_obj = FALSE; | ||||
| 		if (odbc_fetch_into($odbc_result, $rs)) { | ||||
| 			foreach ($rs as $k=>$v) { | ||||
| 				$field_name= odbc_field_name($odbc_result, $k+1); | ||||
| 				$rs_obj->$field_name = $v; | ||||
| 			} | ||||
| 		} | ||||
| 		return $rs_obj; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - array | ||||
| 	 * | ||||
| 	 * subsititutes the odbc_fetch_array function when | ||||
| 	 * not available (odbc_fetch_array requires unixODBC) | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _odbc_fetch_array(& $odbc_result) { | ||||
| 		$rs = array(); | ||||
| 		$rs_assoc = FALSE; | ||||
| 		if (odbc_fetch_into($odbc_result, $rs)) { | ||||
| 			$rs_assoc=array(); | ||||
| 			foreach ($rs as $k=>$v) { | ||||
| 				$field_name= odbc_field_name($odbc_result, $k+1); | ||||
| 				$rs_assoc[$field_name] = $v; | ||||
| 			} | ||||
| 		} | ||||
| 		return $rs_assoc; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file odbc_result.php */ | ||||
| /* Location: ./system/database/drivers/odbc/odbc_result.php */ | ||||
							
								
								
									
										103
									
								
								system/database/drivers/odbc/odbc_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								system/database/drivers/odbc/odbc_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * ODBC Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/database/ | ||||
|  */ | ||||
| class CI_DB_odbc_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		// Not sure if ODBC lets you list all databases... | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		// Not a supported ODBC feature | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		// Not a supported ODBC feature | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * ODBC Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file odbc_utility.php */ | ||||
| /* Location: ./system/database/drivers/odbc/odbc_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/pdo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/pdo/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										812
									
								
								system/database/drivers/pdo/pdo_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										812
									
								
								system/database/drivers/pdo/pdo_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,812 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.1.2 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * PDO Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'pdo'; | ||||
|  | ||||
| 	// the character used to excape - not necessary for PDO | ||||
| 	var $_escape_char = ''; | ||||
| 	var $_like_escape_str; | ||||
| 	var $_like_escape_chr; | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword; | ||||
| 	 | ||||
| 	var $options = array(); | ||||
|  | ||||
| 	function __construct($params) | ||||
| 	{ | ||||
| 		parent::__construct($params); | ||||
|  | ||||
| 		// clause and character used for LIKE escape sequences | ||||
| 		if (strpos($this->hostname, 'mysql') !== FALSE) | ||||
| 		{ | ||||
| 			$this->_like_escape_str = ''; | ||||
| 			$this->_like_escape_chr = ''; | ||||
|  | ||||
| 			//Prior to this version, the charset can't be set in the dsn | ||||
| 			if(is_php('5.3.6')) | ||||
| 			{ | ||||
| 				$this->hostname .= ";charset={$this->char_set}"; | ||||
| 			} | ||||
|  | ||||
| 			//Set the charset with the connection options | ||||
| 			$this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; | ||||
| 		} | ||||
| 		elseif (strpos($this->hostname, 'odbc') !== FALSE) | ||||
| 		{ | ||||
| 			$this->_like_escape_str = " {escape '%s'} "; | ||||
| 			$this->_like_escape_chr = '!'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->_like_escape_str = " ESCAPE '%s' "; | ||||
| 			$this->_like_escape_chr = '!'; | ||||
| 		} | ||||
|  | ||||
| 		empty($this->database) OR $this->hostname .= ';dbname='.$this->database; | ||||
|  | ||||
| 		$this->trans_enabled = FALSE; | ||||
|  | ||||
| 		$this->_random_keyword = ' RND('.time().')'; // database specific random keyword | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		$this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; | ||||
|  | ||||
| 		return new PDO($this->hostname, $this->username, $this->password, $this->options); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		$this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; | ||||
| 		$this->options['PDO::ATTR_PERSISTENT'] = TRUE; | ||||
| 	 | ||||
| 		return new PDO($this->hostname, $this->username, $this->password, $this->options); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		// Not needed for PDO | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return $this->conn_id->getAttribute(PDO::ATTR_CLIENT_VERSION); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		$result_id = $this->conn_id->prepare($sql); | ||||
| 		$result_id->execute(); | ||||
| 		 | ||||
| 		if (is_object($result_id)) | ||||
| 		{ | ||||
| 			if (is_numeric(stripos($sql, 'SELECT'))) | ||||
| 			{ | ||||
| 				$this->affect_rows = count($result_id->fetchAll()); | ||||
| 				$result_id->execute(); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$this->affect_rows = $result_id->rowCount(); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$this->affect_rows = 0; | ||||
| 		} | ||||
| 		 | ||||
| 		return $result_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = (bool) ($test_mode === TRUE); | ||||
|  | ||||
| 		return $this->conn_id->beginTransaction(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$ret = $this->conn->commit(); | ||||
| 		return $ret; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$ret = $this->conn_id->rollBack(); | ||||
| 		return $ret; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
| 		 | ||||
| 		//Escape the string | ||||
| 		$str = $this->conn_id->quote($str); | ||||
| 		 | ||||
| 		//If there are duplicated quotes, trim them away | ||||
| 		if (strpos($str, "'") === 0) | ||||
| 		{ | ||||
| 			$str = substr($str, 1, -1); | ||||
| 		} | ||||
| 		 | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(	array('%', '_', $this->_like_escape_chr), | ||||
| 								array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), | ||||
| 								$str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return $this->affect_rows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 *  | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id($name=NULL) | ||||
| 	{ | ||||
| 		//Convenience method for postgres insertid | ||||
| 		if (strpos($this->hostname, 'pgsql') !== FALSE) | ||||
| 		{ | ||||
| 			$v = $this->_version(); | ||||
|  | ||||
| 			$table	= func_num_args() > 0 ? func_get_arg(0) : NULL; | ||||
|  | ||||
| 			if ($table == NULL && $v >= '8.1') | ||||
| 			{ | ||||
| 				$sql='SELECT LASTVAL() as ins_id'; | ||||
| 			} | ||||
| 			$query = $this->query($sql); | ||||
| 			$row = $query->row(); | ||||
| 			return $row->ins_id; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return $this->conn_id->lastInsertId($name); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SHOW TABLES FROM `".$this->database."`"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			//$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); | ||||
| 			return FALSE; // not currently supported | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SHOW COLUMNS FROM ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT TOP 1 FROM ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		$error_array = $this->conn_id->errorInfo(); | ||||
| 		return $error_array[2]; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return $this->conn_id->errorCode(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 			 | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return (count($tables) == 1) ? $tables[0] : '('.implode(', ', $tables).')'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert_batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   string  the table name | ||||
| 	 * @param   array   the insert keys | ||||
| 	 * @param   array   the insert values | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update_Batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific batch update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update_batch($table, $values, $index, $where = NULL) | ||||
| 	{ | ||||
| 		$ids = array(); | ||||
| 		$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; | ||||
|  | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$ids[] = $val[$index]; | ||||
|  | ||||
| 			foreach (array_keys($val) as $field) | ||||
| 			{ | ||||
| 				if ($field != $index) | ||||
| 				{ | ||||
| 					$final[$field][] =  'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET "; | ||||
| 		$cases = ''; | ||||
|  | ||||
| 		foreach ($final as $k => $v) | ||||
| 		{ | ||||
| 			$cases .= $k.' = CASE '."\n"; | ||||
| 			foreach ($v as $row) | ||||
| 			{ | ||||
| 				$cases .= $row."\n"; | ||||
| 			} | ||||
|  | ||||
| 			$cases .= 'ELSE '.$k.' END, '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= substr($cases, 0, -2); | ||||
|  | ||||
| 		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return $this->_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		if (strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE) | ||||
| 		{ | ||||
| 			if ($offset == 0) | ||||
| 			{ | ||||
| 				$offset = ''; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$offset .= ", "; | ||||
| 			} | ||||
|  | ||||
| 			return $sql."LIMIT ".$offset.$limit; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= "LIMIT ".$limit; | ||||
|  | ||||
| 			if ($offset > 0) | ||||
| 			{ | ||||
| 				$sql .= " OFFSET ".$offset; | ||||
| 			} | ||||
| 			 | ||||
| 			return $sql; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		$this->conn_id = null; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* End of file pdo_driver.php */ | ||||
| /* Location: ./system/database/drivers/pdo/pdo_driver.php */ | ||||
							
								
								
									
										266
									
								
								system/database/drivers/pdo/pdo_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								system/database/drivers/pdo/pdo_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,266 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.1.2 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * PDO Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database() | ||||
| 	{ | ||||
| 		// PDO has no "create database" command since it's | ||||
| 		// designed to connect to an existing database | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		// PDO has no "drop database" command since it's | ||||
| 		// designed to connect to an existing database | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n)"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		// Not a supported PDO feature | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file pdo_forge.php */ | ||||
| /* Location: ./system/database/drivers/pdo/pdo_forge.php */ | ||||
							
								
								
									
										183
									
								
								system/database/drivers/pdo/pdo_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								system/database/drivers/pdo/pdo_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,183 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.1.2 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * PDO Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_result extends CI_DB_result { | ||||
|  | ||||
| 	public $num_rows; | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @return	int | ||||
| 	 */ | ||||
| 	public function num_rows() | ||||
| 	{ | ||||
| 		if (is_int($this->num_rows)) | ||||
| 		{ | ||||
| 			return $this->num_rows; | ||||
| 		} | ||||
| 		elseif (($this->num_rows = $this->result_id->rowCount()) > 0) | ||||
| 		{ | ||||
| 			return $this->num_rows; | ||||
| 		} | ||||
|  | ||||
| 		$this->num_rows = count($this->result_id->fetchAll()); | ||||
| 		$this->result_id->execute(); | ||||
| 		return $this->num_rows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return $this->result_id->columnCount(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$data = array(); | ||||
| 	 | ||||
| 		try | ||||
| 		{ | ||||
| 			for($i = 0; $i < $this->num_fields(); $i++) | ||||
| 			{ | ||||
| 				$data[] = $this->result_id->getColumnMeta($i); | ||||
| 			} | ||||
| 			 | ||||
| 			return $data; | ||||
| 		} | ||||
| 		catch (Exception $e) | ||||
| 		{ | ||||
| 			if ($this->db->db_debug) | ||||
| 			{ | ||||
| 				return $this->db->display_error('db_unsuported_feature'); | ||||
| 			} | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_object($this->result_id)) | ||||
| 		{ | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return $this->result_id->fetch(PDO::FETCH_ASSOC); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{	 | ||||
| 		return $this->result_id->fetchObject(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file pdo_result.php */ | ||||
| /* Location: ./system/database/drivers/pdo/pdo_result.php */ | ||||
							
								
								
									
										103
									
								
								system/database/drivers/pdo/pdo_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								system/database/drivers/pdo/pdo_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 2.1.2 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * PDO Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		EllisLab Dev Team | ||||
|  * @link		http://codeigniter.com/database/ | ||||
|  */ | ||||
| class CI_DB_pdo_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		// Not sure if PDO lets you list all databases... | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		// Not a supported PDO feature | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		// Not a supported PDO feature | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * PDO Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file pdo_utility.php */ | ||||
| /* Location: ./system/database/drivers/pdo/pdo_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/postgre/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/postgre/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										703
									
								
								system/database/drivers/postgre/postgre_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										703
									
								
								system/database/drivers/postgre/postgre_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,703 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Postgre Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_postgre_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'postgre'; | ||||
|  | ||||
| 	var $_escape_char = '"'; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences | ||||
| 	var $_like_escape_str = " ESCAPE '%s' "; | ||||
| 	var $_like_escape_chr = '!'; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword = ' RANDOM()'; // database specific random keyword | ||||
|  | ||||
| 	/** | ||||
| 	 * Connection String | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _connect_string() | ||||
| 	{ | ||||
| 		$components = array( | ||||
| 								'hostname'	=> 'host', | ||||
| 								'port'		=> 'port', | ||||
| 								'database'	=> 'dbname', | ||||
| 								'username'	=> 'user', | ||||
| 								'password'	=> 'password' | ||||
| 							); | ||||
|  | ||||
| 		$connect_string = ""; | ||||
| 		foreach ($components as $key => $val) | ||||
| 		{ | ||||
| 			if (isset($this->$key) && $this->$key != '') | ||||
| 			{ | ||||
| 				$connect_string .= " $val=".$this->$key; | ||||
| 			} | ||||
| 		} | ||||
| 		return trim($connect_string); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		return @pg_connect($this->_connect_string()); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		return @pg_pconnect($this->_connect_string()); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		if (pg_ping($this->conn_id) === FALSE) | ||||
| 		{ | ||||
| 			$this->conn_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		// Not needed for Postgre so we'll return TRUE | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return "SELECT version() AS ver"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return @pg_query($this->conn_id, $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		return @pg_exec($this->conn_id, "begin"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return @pg_exec($this->conn_id, "commit"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return @pg_exec($this->conn_id, "rollback"); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$str = pg_escape_string($str); | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(	array('%', '_', $this->_like_escape_chr), | ||||
| 								array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), | ||||
| 								$str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @pg_affected_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		$v = $this->_version(); | ||||
| 		$v = $v['server']; | ||||
|  | ||||
| 		$table	= func_num_args() > 0 ? func_get_arg(0) : NULL; | ||||
| 		$column	= func_num_args() > 1 ? func_get_arg(1) : NULL; | ||||
|  | ||||
| 		if ($table == NULL && $v >= '8.1') | ||||
| 		{ | ||||
| 			$sql='SELECT LASTVAL() as ins_id'; | ||||
| 		} | ||||
| 		elseif ($table != NULL && $column != NULL && $v >= '8.0') | ||||
| 		{ | ||||
| 			$sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column); | ||||
| 			$query = $this->query($sql); | ||||
| 			$row = $query->row(); | ||||
| 			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq); | ||||
| 		} | ||||
| 		elseif ($table != NULL) | ||||
| 		{ | ||||
| 			// seq_name passed in table parameter | ||||
| 			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return pg_last_oid($this->result_id); | ||||
| 		} | ||||
| 		$query = $this->query($sql); | ||||
| 		$row = $query->row(); | ||||
| 		return $row->ins_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Show table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			$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 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT * FROM ".$table." LIMIT 1"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return pg_last_error($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return ''; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return implode(', ', $tables); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert_batch statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access  public | ||||
| 	 * @param   string  the table name | ||||
| 	 * @param   array   the insert keys | ||||
| 	 * @param   array   the insert values | ||||
| 	 * @return  string | ||||
| 	 */ | ||||
| 	function _insert_batch($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		$sql .= "LIMIT ".$limit; | ||||
|  | ||||
| 		if ($offset > 0) | ||||
| 		{ | ||||
| 			$sql .= " OFFSET ".$offset; | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@pg_close($conn_id); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file postgre_driver.php */ | ||||
| /* Location: ./system/database/drivers/postgre/postgre_driver.php */ | ||||
							
								
								
									
										299
									
								
								system/database/drivers/postgre/postgre_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								system/database/drivers/postgre/postgre_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,299 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Postgre Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_postgre_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		return "CREATE DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		return "DROP DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			if ($this->db->table_exists($table)) | ||||
| 			{ | ||||
| 				return "SELECT * FROM $table"; // Needs to return innocous but valid SQL statement | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$is_unsigned = (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE); | ||||
|  | ||||
| 				// Convert datatypes to be PostgreSQL-compatible | ||||
| 				switch (strtoupper($attributes['TYPE'])) | ||||
| 				{ | ||||
| 					case 'TINYINT': | ||||
| 						$attributes['TYPE'] = 'SMALLINT'; | ||||
| 						break; | ||||
| 					case 'SMALLINT': | ||||
| 						$attributes['TYPE'] = ($is_unsigned) ? 'INTEGER' : 'SMALLINT'; | ||||
| 						break; | ||||
| 					case 'MEDIUMINT': | ||||
| 						$attributes['TYPE'] = 'INTEGER'; | ||||
| 						break; | ||||
| 					case 'INT': | ||||
| 						$attributes['TYPE'] = ($is_unsigned) ? 'BIGINT' : 'INTEGER'; | ||||
| 						break; | ||||
| 					case 'BIGINT': | ||||
| 						$attributes['TYPE'] = ($is_unsigned) ? 'NUMERIC' : 'BIGINT'; | ||||
| 						break; | ||||
| 					case 'DOUBLE': | ||||
| 						$attributes['TYPE'] = 'DOUBLE PRECISION'; | ||||
| 						break; | ||||
| 					case 'DATETIME': | ||||
| 						$attributes['TYPE'] = 'TIMESTAMP'; | ||||
| 						break; | ||||
| 					case 'LONGTEXT': | ||||
| 						$attributes['TYPE'] = 'TEXT'; | ||||
| 						break; | ||||
| 					case 'BLOB': | ||||
| 						$attributes['TYPE'] = 'BYTEA'; | ||||
| 						break; | ||||
| 				} | ||||
|  | ||||
| 				// If this is an auto-incrementing primary key, use the serial data type instead | ||||
| 				if (in_array($field, $primary_keys) && array_key_exists('AUTO_INCREMENT', $attributes)  | ||||
| 					&& $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' SERIAL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .=  ' '.$attributes['TYPE']; | ||||
| 				} | ||||
|  | ||||
| 				// Modified to prevent constraints with integer data types | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes) && strpos($attributes['TYPE'], 'INT') === false) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				// Added new attribute to create unqite fields. Also works with MySQL | ||||
| 				if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNIQUE'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			// Something seems to break when passing an array to _protect_identifiers() | ||||
| 			foreach ($primary_keys as $index => $key) | ||||
| 			{ | ||||
| 				$primary_keys[$index] = $this->db->_protect_identifiers($key); | ||||
| 			} | ||||
|  | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n);"; | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				foreach ($key as $field) | ||||
| 				{ | ||||
| 					$sql .= "CREATE INDEX " . $table . "_" . str_replace(array('"', "'"), '', $field) . "_index ON $table ($field); "; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access    private | ||||
| 	 * @return    bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table)." CASCADE"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file postgre_forge.php */ | ||||
| /* Location: ./system/database/drivers/postgre/postgre_forge.php */ | ||||
							
								
								
									
										169
									
								
								system/database/drivers/postgre/postgre_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								system/database/drivers/postgre/postgre_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,169 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Postgres Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_postgre_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @pg_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @pg_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		for ($i = 0; $i < $this->num_fields(); $i++) | ||||
| 		{ | ||||
| 			$field_names[] = pg_field_name($this->result_id, $i); | ||||
| 		} | ||||
|  | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0; $i < $this->num_fields(); $i++) | ||||
| 		{ | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= pg_field_name($this->result_id, $i); | ||||
| 			$F->type		= pg_field_type($this->result_id, $i); | ||||
| 			$F->max_length	= pg_field_size($this->result_id, $i); | ||||
| 			$F->primary_key = 0; | ||||
| 			$F->default		= ''; | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_resource($this->result_id)) | ||||
| 		{ | ||||
| 			pg_free_result($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return pg_result_seek($this->result_id, $n); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return pg_fetch_assoc($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		return pg_fetch_object($this->result_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file postgre_result.php */ | ||||
| /* Location: ./system/database/drivers/postgre/postgre_result.php */ | ||||
							
								
								
									
										88
									
								
								system/database/drivers/postgre/postgre_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								system/database/drivers/postgre/postgre_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Postgre Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_postgre_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		return "SELECT datname FROM pg_database"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Is table optimization supported in Postgre? | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Are table repairs supported in Postgre? | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Postgre Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file postgre_utility.php */ | ||||
| /* Location: ./system/database/drivers/postgre/postgre_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/sqlite/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/sqlite/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										658
									
								
								system/database/drivers/sqlite/sqlite_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										658
									
								
								system/database/drivers/sqlite/sqlite_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,658 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * SQLite Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlite_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'sqlite'; | ||||
|  | ||||
| 	// The character used to escape with - not needed for SQLite | ||||
| 	var $_escape_char = ''; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences | ||||
| 	var $_like_escape_str = " ESCAPE '%s' "; | ||||
| 	var $_like_escape_chr = '!'; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword = ' Random()'; // database specific random keyword | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect() | ||||
| 	{ | ||||
| 		if ( ! $conn_id = @sqlite_open($this->database, FILE_WRITE_MODE, $error)) | ||||
| 		{ | ||||
| 			log_message('error', $error); | ||||
|  | ||||
| 			if ($this->db_debug) | ||||
| 			{ | ||||
| 				$this->display_error($error, '', TRUE); | ||||
| 			} | ||||
|  | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return $conn_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error)) | ||||
| 		{ | ||||
| 			log_message('error', $error); | ||||
|  | ||||
| 			if ($this->db_debug) | ||||
| 			{ | ||||
| 				$this->display_error($error, '', TRUE); | ||||
| 			} | ||||
|  | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return $conn_id; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		// not implemented in SQLite | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Version number query string | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		return sqlite_libversion(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return @sqlite_query($this->conn_id, $sql); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		$this->simple_query('BEGIN TRANSACTION'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('COMMIT'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		$this->simple_query('ROLLBACK'); | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = $this->escape_str($val, $like); | ||||
| 			} | ||||
|  | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$str = sqlite_escape_string($str); | ||||
|  | ||||
| 		// escape LIKE condition wildcards | ||||
| 		if ($like === TRUE) | ||||
| 		{ | ||||
| 			$str = str_replace(	array('%', '_', $this->_like_escape_chr), | ||||
| 								array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), | ||||
| 								$str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return sqlite_changes($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert ID | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		return @sqlite_last_insert_rowid($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); | ||||
|  | ||||
| 		if ($query->num_rows() == 0) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return (int) $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		$sql = "SELECT name from sqlite_master WHERE type='table'"; | ||||
|  | ||||
| 		if ($prefix_limit !== FALSE AND $this->dbprefix != '') | ||||
| 		{ | ||||
| 			$sql .= " AND '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 | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		// Not supported | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT * FROM ".$table." LIMIT 1"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		return sqlite_error_string(sqlite_last_error($this->conn_id)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		return sqlite_last_error($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		if ($this->_escape_char == '') | ||||
| 		{ | ||||
| 			return $item; | ||||
| 		} | ||||
|  | ||||
| 		foreach ($this->_reserved_identifiers as $id) | ||||
| 		{ | ||||
| 			if (strpos($item, '.'.$id) !== FALSE) | ||||
| 			{ | ||||
| 				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); | ||||
|  | ||||
| 				// remove duplicates if the user already included the escape | ||||
| 				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (strpos($item, '.') !== FALSE) | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = $this->_escape_char.$item.$this->_escape_char; | ||||
| 		} | ||||
|  | ||||
| 		// remove duplicates if the user already included the escape | ||||
| 		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return '('.implode(', ', $tables).')'; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{ | ||||
| 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where, $orderby = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		foreach ($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; | ||||
|  | ||||
| 		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr); | ||||
|  | ||||
| 		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; | ||||
|  | ||||
| 		$sql .= $orderby.$limit; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return $this->_delete($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where = array(), $like = array(), $limit = FALSE) | ||||
| 	{ | ||||
| 		$conditions = ''; | ||||
|  | ||||
| 		if (count($where) > 0 OR count($like) > 0) | ||||
| 		{ | ||||
| 			$conditions = "\nWHERE "; | ||||
| 			$conditions .= implode("\n", $this->ar_where); | ||||
|  | ||||
| 			if (count($where) > 0 && count($like) > 0) | ||||
| 			{ | ||||
| 				$conditions .= " AND "; | ||||
| 			} | ||||
| 			$conditions .= implode("\n", $like); | ||||
| 		} | ||||
|  | ||||
| 		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit; | ||||
|  | ||||
| 		return "DELETE FROM ".$table.$conditions.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		if ($offset == 0) | ||||
| 		{ | ||||
| 			$offset = ''; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$offset .= ", "; | ||||
| 		} | ||||
|  | ||||
| 		return $sql."LIMIT ".$offset.$limit; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@sqlite_close($conn_id); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file sqlite_driver.php */ | ||||
| /* Location: ./system/database/drivers/sqlite/sqlite_driver.php */ | ||||
							
								
								
									
										265
									
								
								system/database/drivers/sqlite/sqlite_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								system/database/drivers/sqlite/sqlite_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,265 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLite Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlite_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database() | ||||
| 	{ | ||||
| 		// 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 | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database)) | ||||
| 		{ | ||||
| 			if ($this->db->db_debug) | ||||
| 			{ | ||||
| 				return $this->db->display_error('db_unable_to_drop'); | ||||
| 			} | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 		return TRUE; | ||||
| 	} | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		// IF NOT EXISTS added to SQLite in 3.3.0 | ||||
| 		if ($if_not_exists === TRUE && version_compare($this->db->_version(), '3.3.0', '>=') === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)."("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n)"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 *  Unsupported feature in SQLite | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		if ($this->db->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return array(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			// SQLite does not support dropping columns | ||||
| 			// http://www.sqlite.org/omitted.html | ||||
| 			// http://www.sqlite.org/faq.html#q11 | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file sqlite_forge.php */ | ||||
| /* Location: ./system/database/drivers/sqlite/sqlite_forge.php */ | ||||
							
								
								
									
										179
									
								
								system/database/drivers/sqlite/sqlite_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								system/database/drivers/sqlite/sqlite_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,179 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLite Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlite_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @sqlite_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @sqlite_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		for ($i = 0; $i < $this->num_fields(); $i++) | ||||
| 		{ | ||||
| 			$field_names[] = sqlite_field_name($this->result_id, $i); | ||||
| 		} | ||||
|  | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		for ($i = 0; $i < $this->num_fields(); $i++) | ||||
| 		{ | ||||
| 			$F				= new stdClass(); | ||||
| 			$F->name		= sqlite_field_name($this->result_id, $i); | ||||
| 			$F->type		= 'varchar'; | ||||
| 			$F->max_length	= 0; | ||||
| 			$F->primary_key = 0; | ||||
| 			$F->default		= ''; | ||||
|  | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
|  | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		// Not implemented in SQLite | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		return sqlite_seek($this->result_id, $n); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return sqlite_fetch_array($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		if (function_exists('sqlite_fetch_object')) | ||||
| 		{ | ||||
| 			return sqlite_fetch_object($this->result_id); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC); | ||||
| 			if (is_array($arr)) | ||||
| 			{ | ||||
| 				$obj = (object) $arr; | ||||
| 				return $obj; | ||||
| 			} else { | ||||
| 				return NULL; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file sqlite_result.php */ | ||||
| /* Location: ./system/database/drivers/sqlite/sqlite_result.php */ | ||||
							
								
								
									
										96
									
								
								system/database/drivers/sqlite/sqlite_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								system/database/drivers/sqlite/sqlite_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,96 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLite Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlite_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * I don't believe you can do a database listing with SQLite | ||||
| 	 * since each database is its own file.  I suppose we could | ||||
| 	 * try reading a directory looking for SQLite files, but | ||||
| 	 * that doesn't seem like a terribly good idea | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		if ($this->db_debug) | ||||
| 		{ | ||||
| 			return $this->db->display_error('db_unsuported_feature'); | ||||
| 		} | ||||
| 		return array(); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Is optimization even supported in SQLite? | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Are table repairs even supported in SQLite? | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * SQLite Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file sqlite_utility.php */ | ||||
| /* Location: ./system/database/drivers/sqlite/sqlite_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/drivers/sqlsrv/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/drivers/sqlsrv/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										599
									
								
								system/database/drivers/sqlsrv/sqlsrv_driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										599
									
								
								system/database/drivers/sqlsrv/sqlsrv_driver.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,599 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLSRV Database Adapter Class | ||||
|  * | ||||
|  * Note: _DB is an extender class that the app controller | ||||
|  * creates dynamically based on whether the active record | ||||
|  * class is being used or not. | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Drivers | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlsrv_driver extends CI_DB { | ||||
|  | ||||
| 	var $dbdriver = 'sqlsrv'; | ||||
|  | ||||
| 	// The character used for escaping | ||||
| 	var $_escape_char = ''; | ||||
|  | ||||
| 	// clause and character used for LIKE escape sequences | ||||
| 	var $_like_escape_str = " ESCAPE '%s' "; | ||||
| 	var $_like_escape_chr = '!'; | ||||
|  | ||||
| 	/** | ||||
| 	 * The syntax to count rows is slightly different across different | ||||
| 	 * database engines, so this string appears in each driver and is | ||||
| 	 * used for the count_all() and count_all_results() functions. | ||||
| 	 */ | ||||
| 	var $_count_string = "SELECT COUNT(*) AS "; | ||||
| 	var $_random_keyword = ' ASC'; // not currently supported | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_connect($pooling = false) | ||||
| 	{ | ||||
| 		// Check for a UTF-8 charset being passed as CI's default 'utf8'. | ||||
| 		$character_set = (0 === strcasecmp('utf8', $this->char_set)) ? 'UTF-8' : $this->char_set; | ||||
|  | ||||
| 		$connection = array( | ||||
| 			'UID'				=> empty($this->username) ? '' : $this->username, | ||||
| 			'PWD'				=> empty($this->password) ? '' : $this->password, | ||||
| 			'Database'			=> $this->database, | ||||
| 			'ConnectionPooling' => $pooling ? 1 : 0, | ||||
| 			'CharacterSet'		=> $character_set, | ||||
| 			'ReturnDatesAsStrings' => 1 | ||||
| 		); | ||||
| 		 | ||||
| 		// If the username and password are both empty, assume this is a  | ||||
| 		// 'Windows Authentication Mode' connection. | ||||
| 		if(empty($connection['UID']) && empty($connection['PWD'])) { | ||||
| 			unset($connection['UID'], $connection['PWD']); | ||||
| 		} | ||||
|  | ||||
| 		return sqlsrv_connect($this->hostname, $connection); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Persistent database connection | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_pconnect() | ||||
| 	{ | ||||
| 		$this->db_connect(TRUE); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Reconnect | ||||
| 	 * | ||||
| 	 * Keep / reestablish the db connection if no queries have been | ||||
| 	 * sent for a length of time exceeding the server's idle timeout | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function reconnect() | ||||
| 	{ | ||||
| 		// not implemented in MSSQL | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Select the database | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_select() | ||||
| 	{ | ||||
| 		return $this->_execute('USE ' . $this->database); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Set client character set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	string | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function db_set_charset($charset, $collation) | ||||
| 	{ | ||||
| 		// @todo - add support if needed | ||||
| 		return TRUE; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Execute the query | ||||
| 	 * | ||||
| 	 * @access	private called by the base class | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	resource | ||||
| 	 */ | ||||
| 	function _execute($sql) | ||||
| 	{ | ||||
| 		$sql = $this->_prep_query($sql); | ||||
| 		return sqlsrv_query($this->conn_id, $sql, null, array( | ||||
| 			'Scrollable'				=> SQLSRV_CURSOR_STATIC, | ||||
| 			'SendStreamParamsAtExec'	=> true | ||||
| 		)); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Prep the query | ||||
| 	 * | ||||
| 	 * If needed, each database adapter can prep the query string | ||||
| 	 * | ||||
| 	 * @access	private called by execute() | ||||
| 	 * @param	string	an SQL query | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _prep_query($sql) | ||||
| 	{ | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Begin Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_begin($test_mode = FALSE) | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// Reset the transaction failure flag. | ||||
| 		// If the $test_mode flag is set to TRUE transactions will be rolled back | ||||
| 		// even if the queries produce a successful result. | ||||
| 		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; | ||||
|  | ||||
| 		return sqlsrv_begin_transaction($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Commit Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_commit() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return sqlsrv_commit($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rollback Transaction | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function trans_rollback() | ||||
| 	{ | ||||
| 		if ( ! $this->trans_enabled) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		// When transactions are nested we only begin/commit/rollback the outermost ones | ||||
| 		if ($this->_trans_depth > 0) | ||||
| 		{ | ||||
| 			return TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return sqlsrv_rollback($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape String | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @param	bool	whether or not the string will be used in a LIKE condition | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function escape_str($str, $like = FALSE) | ||||
| 	{ | ||||
| 		// Escape single quotes | ||||
| 		return str_replace("'", "''", $str); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Affected Rows | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function affected_rows() | ||||
| 	{ | ||||
| 		return @sqlrv_rows_affected($this->conn_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Insert ID | ||||
| 	* | ||||
| 	* Returns the last id created in the Identity column. | ||||
| 	* | ||||
| 	* @access public | ||||
| 	* @return integer | ||||
| 	*/ | ||||
| 	function insert_id() | ||||
| 	{ | ||||
| 		return $this->query('select @@IDENTITY as insert_id')->row('insert_id'); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Parse major version | ||||
| 	* | ||||
| 	* Grabs the major version number from the | ||||
| 	* database server version string passed in. | ||||
| 	* | ||||
| 	* @access private | ||||
| 	* @param string $version | ||||
| 	* @return int16 major version number | ||||
| 	*/ | ||||
| 	function _parse_major_version($version) | ||||
| 	{ | ||||
| 		preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info); | ||||
| 		return $ver_info[1]; // return the major version b/c that's all we're interested in. | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	* Version number query string | ||||
| 	* | ||||
| 	* @access public | ||||
| 	* @return string | ||||
| 	*/ | ||||
| 	function _version() | ||||
| 	{ | ||||
| 		$info = sqlsrv_server_info($this->conn_id); | ||||
| 		return sprintf("select '%s' as ver", $info['SQLServerVersion']); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * "Count All" query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string that counts all records in | ||||
| 	 * the specified database | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function count_all($table = '') | ||||
| 	{ | ||||
| 		if ($table == '') | ||||
| 			return '0'; | ||||
| 	 | ||||
| 		$query = $this->query("SELECT COUNT(*) AS numrows FROM " . $this->dbprefix . $table); | ||||
| 		 | ||||
| 		if ($query->num_rows() == 0) | ||||
| 			return '0'; | ||||
|  | ||||
| 		$row = $query->row(); | ||||
| 		$this->_reset_select(); | ||||
| 		return $row->numrows; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the table names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	boolean | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_tables($prefix_limit = FALSE) | ||||
| 	{ | ||||
| 		return "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * List column query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query string so that the column names can be fetched | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _list_columns($table = '') | ||||
| 	{ | ||||
| 		return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$this->_escape_table($table)."'"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that the column data can be retrieved | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _field_data($table) | ||||
| 	{ | ||||
| 		return "SELECT TOP 1 * FROM " . $this->_escape_table($table);	 | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message string | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _error_message() | ||||
| 	{ | ||||
| 		$error = array_shift(sqlsrv_errors()); | ||||
| 		return !empty($error['message']) ? $error['message'] : null; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * The error message number | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function _error_number() | ||||
| 	{ | ||||
| 		$error = array_shift(sqlsrv_errors()); | ||||
| 		return isset($error['SQLSTATE']) ? $error['SQLSTATE'] : null; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape Table Name | ||||
| 	 * | ||||
| 	 * This function adds backticks if the table name has a period | ||||
| 	 * in it. Some DBs will get cranky unless periods are escaped | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_table($table) | ||||
| 	{ | ||||
| 		return $table; | ||||
| 	}	 | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Escape the SQL Identifiers | ||||
| 	 * | ||||
| 	 * This function escapes column and table names | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _escape_identifiers($item) | ||||
| 	{ | ||||
| 		return $item; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * From Tables | ||||
| 	 * | ||||
| 	 * This function implicitly groups FROM tables so there is no confusion | ||||
| 	 * about operator precedence in harmony with SQL standards | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	type | ||||
| 	 * @return	type | ||||
| 	 */ | ||||
| 	function _from_tables($tables) | ||||
| 	{ | ||||
| 		if ( ! is_array($tables)) | ||||
| 		{ | ||||
| 			$tables = array($tables); | ||||
| 		} | ||||
|  | ||||
| 		return implode(', ', $tables); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Insert statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific insert string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the insert keys | ||||
| 	 * @param	array	the insert values | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _insert($table, $keys, $values) | ||||
| 	{	 | ||||
| 		return "INSERT INTO ".$this->_escape_table($table)." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Update statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific update string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the update data | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	array	the orderby clause | ||||
| 	 * @param	array	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _update($table, $values, $where) | ||||
| 	{ | ||||
| 		foreach($values as $key => $val) | ||||
| 		{ | ||||
| 			$valstr[] = $key." = ".$val; | ||||
| 		} | ||||
| 	 | ||||
| 		return "UPDATE ".$this->_escape_table($table)." SET ".implode(', ', $valstr)." WHERE ".implode(" ", $where); | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncate statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific truncate string from the supplied data | ||||
| 	 * If the database does not support the truncate() command | ||||
| 	 * This function maps to "DELETE FROM table" | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _truncate($table) | ||||
| 	{ | ||||
| 		return "TRUNCATE ".$table; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Delete statement | ||||
| 	 * | ||||
| 	 * Generates a platform-specific delete string from the supplied data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the where clause | ||||
| 	 * @param	string	the limit clause | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _delete($table, $where) | ||||
| 	{ | ||||
| 		return "DELETE FROM ".$this->_escape_table($table)." WHERE ".implode(" ", $where); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Limit string | ||||
| 	 * | ||||
| 	 * Generates a platform-specific LIMIT clause | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	string	the sql query string | ||||
| 	 * @param	integer	the number of rows to limit the query to | ||||
| 	 * @param	integer	the offset value | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _limit($sql, $limit, $offset) | ||||
| 	{ | ||||
| 		$i = $limit + $offset; | ||||
| 	 | ||||
| 		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);		 | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Close DB Connection | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @param	resource | ||||
| 	 * @return	void | ||||
| 	 */ | ||||
| 	function _close($conn_id) | ||||
| 	{ | ||||
| 		@sqlsrv_close($conn_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* End of file mssql_driver.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_driver.php */ | ||||
							
								
								
									
										248
									
								
								system/database/drivers/sqlsrv/sqlsrv_forge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								system/database/drivers/sqlsrv/sqlsrv_forge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,248 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLSRV Forge Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlsrv_forge extends CI_DB_forge { | ||||
|  | ||||
| 	/** | ||||
| 	 * Create database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_database($name) | ||||
| 	{ | ||||
| 		return "CREATE DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop database | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the database name | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_database($name) | ||||
| 	{ | ||||
| 		return "DROP DATABASE ".$name; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Drop Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _drop_table($table) | ||||
| 	{ | ||||
| 		return "DROP TABLE ".$this->db->_escape_identifiers($table); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Create Table | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	array	the fields | ||||
| 	 * @param	mixed	primary key(s) | ||||
| 	 * @param	mixed	key(s) | ||||
| 	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) | ||||
| 	{ | ||||
| 		$sql = 'CREATE TABLE '; | ||||
|  | ||||
| 		if ($if_not_exists === TRUE) | ||||
| 		{ | ||||
| 			$sql .= 'IF NOT EXISTS '; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= $this->db->_escape_identifiers($table)." ("; | ||||
| 		$current_field_count = 0; | ||||
|  | ||||
| 		foreach ($fields as $field=>$attributes) | ||||
| 		{ | ||||
| 			// Numeric field names aren't allowed in databases, so if the key is | ||||
| 			// numeric, we know it was assigned by PHP and the developer manually | ||||
| 			// entered the field information, so we'll simply add it to the list | ||||
| 			if (is_numeric($field)) | ||||
| 			{ | ||||
| 				$sql .= "\n\t$attributes"; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$attributes = array_change_key_case($attributes, CASE_UPPER); | ||||
|  | ||||
| 				$sql .= "\n\t".$this->db->_protect_identifiers($field); | ||||
|  | ||||
| 				$sql .=  ' '.$attributes['TYPE']; | ||||
|  | ||||
| 				if (array_key_exists('CONSTRAINT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= '('.$attributes['CONSTRAINT'].')'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' UNSIGNED'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('DEFAULT', $attributes)) | ||||
| 				{ | ||||
| 					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' NULL'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$sql .= ' NOT NULL'; | ||||
| 				} | ||||
|  | ||||
| 				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) | ||||
| 				{ | ||||
| 					$sql .= ' AUTO_INCREMENT'; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// don't add a comma on the end of the last field | ||||
| 			if (++$current_field_count < count($fields)) | ||||
| 			{ | ||||
| 				$sql .= ','; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (count($primary_keys) > 0) | ||||
| 		{ | ||||
| 			$primary_keys = $this->db->_protect_identifiers($primary_keys); | ||||
| 			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; | ||||
| 		} | ||||
|  | ||||
| 		if (is_array($keys) && count($keys) > 0) | ||||
| 		{ | ||||
| 			foreach ($keys as $key) | ||||
| 			{ | ||||
| 				if (is_array($key)) | ||||
| 				{ | ||||
| 					$key = $this->db->_protect_identifiers($key); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$key = array($this->db->_protect_identifiers($key)); | ||||
| 				} | ||||
|  | ||||
| 				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$sql .= "\n)"; | ||||
|  | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Alter table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be altered | ||||
| 	 * Called by add_column(), drop_column(), and column_alter(), | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the ALTER type (ADD, DROP, CHANGE) | ||||
| 	 * @param	string	the column name | ||||
| 	 * @param	string	the table name | ||||
| 	 * @param	string	the column definition | ||||
| 	 * @param	string	the default value | ||||
| 	 * @param	boolean	should 'NOT NULL' be added | ||||
| 	 * @param	string	the field after which we should add the new field | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') | ||||
| 	{ | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); | ||||
|  | ||||
| 		// DROP has everything it needs now. | ||||
| 		if ($alter_type == 'DROP') | ||||
| 		{ | ||||
| 			return $sql; | ||||
| 		} | ||||
|  | ||||
| 		$sql .= " $column_definition"; | ||||
|  | ||||
| 		if ($default_value != '') | ||||
| 		{ | ||||
| 			$sql .= " DEFAULT \"$default_value\""; | ||||
| 		} | ||||
|  | ||||
| 		if ($null === NULL) | ||||
| 		{ | ||||
| 			$sql .= ' NULL'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$sql .= ' NOT NULL'; | ||||
| 		} | ||||
|  | ||||
| 		if ($after_field != '') | ||||
| 		{ | ||||
| 			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); | ||||
| 		} | ||||
|  | ||||
| 		return $sql; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Rename a table | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be renamed | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the old table name | ||||
| 	 * @param	string	the new table name | ||||
| 	 * @return	string | ||||
| 	 */ | ||||
| 	function _rename_table($table_name, $new_table_name) | ||||
| 	{ | ||||
| 		// I think this syntax will work, but can find little documentation on renaming tables in MSSQL | ||||
| 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); | ||||
| 		return $sql; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file mssql_forge.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_forge.php */ | ||||
							
								
								
									
										169
									
								
								system/database/drivers/sqlsrv/sqlsrv_result.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								system/database/drivers/sqlsrv/sqlsrv_result.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,169 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLSRV Result Class | ||||
|  * | ||||
|  * This class extends the parent result class: CI_DB_result | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlsrv_result extends CI_DB_result { | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of rows in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_rows() | ||||
| 	{ | ||||
| 		return @sqlsrv_num_rows($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Number of fields in the result set | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	integer | ||||
| 	 */ | ||||
| 	function num_fields() | ||||
| 	{ | ||||
| 		return @sqlsrv_num_fields($this->result_id); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetch Field Names | ||||
| 	 * | ||||
| 	 * Generates an array of column names | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function list_fields() | ||||
| 	{ | ||||
| 		$field_names = array(); | ||||
| 		foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field) | ||||
| 		{ | ||||
| 			$field_names[] = $field['Name']; | ||||
| 		} | ||||
| 		 | ||||
| 		return $field_names; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Field data | ||||
| 	 * | ||||
| 	 * Generates an array of objects containing field meta-data | ||||
| 	 * | ||||
| 	 * @access	public | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function field_data() | ||||
| 	{ | ||||
| 		$retval = array(); | ||||
| 		foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field) | ||||
| 		{ | ||||
| 			$F 				= new stdClass(); | ||||
| 			$F->name 		= $field['Name']; | ||||
| 			$F->type 		= $field['Type']; | ||||
| 			$F->max_length	= $field['Size']; | ||||
| 			$F->primary_key = 0; | ||||
| 			$F->default		= ''; | ||||
| 			 | ||||
| 			$retval[] = $F; | ||||
| 		} | ||||
| 		 | ||||
| 		return $retval; | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Free the result | ||||
| 	 * | ||||
| 	 * @return	null | ||||
| 	 */ | ||||
| 	function free_result() | ||||
| 	{ | ||||
| 		if (is_resource($this->result_id)) | ||||
| 		{ | ||||
| 			sqlsrv_free_stmt($this->result_id); | ||||
| 			$this->result_id = FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Data Seek | ||||
| 	 * | ||||
| 	 * Moves the internal pointer to the desired offset.  We call | ||||
| 	 * this internally before fetching results to make sure the | ||||
| 	 * result set starts at zero | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _data_seek($n = 0) | ||||
| 	{ | ||||
| 		// Not implemented | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - associative array | ||||
| 	 * | ||||
| 	 * Returns the result set as an array | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	array | ||||
| 	 */ | ||||
| 	function _fetch_assoc() | ||||
| 	{ | ||||
| 		return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Result - object | ||||
| 	 * | ||||
| 	 * Returns the result set as an object | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _fetch_object() | ||||
| 	{ | ||||
| 		return sqlsrv_fetch_object($this->result_id); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file mssql_result.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_result.php */ | ||||
							
								
								
									
										88
									
								
								system/database/drivers/sqlsrv/sqlsrv_utility.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								system/database/drivers/sqlsrv/sqlsrv_utility.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * SQLSRV Utility Class | ||||
|  * | ||||
|  * @category	Database | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/database/ | ||||
|  */ | ||||
| class CI_DB_sqlsrv_utility extends CI_DB_utility { | ||||
|  | ||||
| 	/** | ||||
| 	 * List databases | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @return	bool | ||||
| 	 */ | ||||
| 	function _list_databases() | ||||
| 	{ | ||||
| 		return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Optimize table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be optimized | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _optimize_table($table) | ||||
| 	{ | ||||
| 		return FALSE; // Is this supported in MS SQL? | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * Repair table query | ||||
| 	 * | ||||
| 	 * Generates a platform-specific query so that a table can be repaired | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	string	the table name | ||||
| 	 * @return	object | ||||
| 	 */ | ||||
| 	function _repair_table($table) | ||||
| 	{ | ||||
| 		return FALSE; // Is this supported in MS SQL? | ||||
| 	} | ||||
|  | ||||
| 	// -------------------------------------------------------------------- | ||||
|  | ||||
| 	/** | ||||
| 	 * MSSQL Export | ||||
| 	 * | ||||
| 	 * @access	private | ||||
| 	 * @param	array	Preferences | ||||
| 	 * @return	mixed | ||||
| 	 */ | ||||
| 	function _backup($params = array()) | ||||
| 	{ | ||||
| 		// Currently unsupported | ||||
| 		return $this->db->display_error('db_unsuported_feature'); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| /* End of file mssql_utility.php */ | ||||
| /* Location: ./system/database/drivers/mssql/mssql_utility.php */ | ||||
							
								
								
									
										10
									
								
								system/database/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/database/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										10
									
								
								system/fonts/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/fonts/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										
											BIN
										
									
								
								system/fonts/texb.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								system/fonts/texb.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										119
									
								
								system/helpers/array_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								system/helpers/array_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Array Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/array_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Element | ||||
|  * | ||||
|  * Lets you determine whether an array index is set and whether it has a value. | ||||
|  * If the element is empty it returns FALSE (or whatever you specify as the default value.) | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	array | ||||
|  * @param	mixed | ||||
|  * @return	mixed	depends on what the array contains | ||||
|  */ | ||||
| if ( ! function_exists('element')) | ||||
| { | ||||
| 	function element($item, $array, $default = FALSE) | ||||
| 	{ | ||||
| 		if ( ! isset($array[$item]) OR $array[$item] == "") | ||||
| 		{ | ||||
| 			return $default; | ||||
| 		} | ||||
|  | ||||
| 		return $array[$item]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Random Element - Takes an array as input and returns a random element | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	array | ||||
|  * @return	mixed	depends on what the array contains | ||||
|  */ | ||||
| if ( ! function_exists('random_element')) | ||||
| { | ||||
| 	function random_element($array) | ||||
| 	{ | ||||
| 		if ( ! is_array($array)) | ||||
| 		{ | ||||
| 			return $array; | ||||
| 		} | ||||
|  | ||||
| 		return $array[array_rand($array)]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Elements | ||||
|  * | ||||
|  * Returns only the array items specified.  Will return a default value if | ||||
|  * it is not set. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	array | ||||
|  * @param	array | ||||
|  * @param	mixed | ||||
|  * @return	mixed	depends on what the array contains | ||||
|  */ | ||||
| if ( ! function_exists('elements')) | ||||
| { | ||||
| 	function elements($items, $array, $default = FALSE) | ||||
| 	{ | ||||
| 		$return = array(); | ||||
| 		 | ||||
| 		if ( ! is_array($items)) | ||||
| 		{ | ||||
| 			$items = array($items); | ||||
| 		} | ||||
| 		 | ||||
| 		foreach ($items as $item) | ||||
| 		{ | ||||
| 			if (isset($array[$item])) | ||||
| 			{ | ||||
| 				$return[$item] = $array[$item]; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$return[$item] = $default; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $return; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file array_helper.php */ | ||||
| /* Location: ./system/helpers/array_helper.php */ | ||||
							
								
								
									
										246
									
								
								system/helpers/captcha_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								system/helpers/captcha_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,246 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter CAPTCHA Helper | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/xml_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Create CAPTCHA | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	array	array of data for the CAPTCHA | ||||
|  * @param	string	path to create the image in | ||||
|  * @param	string	URL to the CAPTCHA image folder | ||||
|  * @param	string	server path to font | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('create_captcha')) | ||||
| { | ||||
| 	function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '') | ||||
| 	{ | ||||
| 		$defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200); | ||||
|  | ||||
| 		foreach ($defaults as $key => $val) | ||||
| 		{ | ||||
| 			if ( ! is_array($data)) | ||||
| 			{ | ||||
| 				if ( ! isset($$key) OR $$key == '') | ||||
| 				{ | ||||
| 					$$key = $val; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$$key = ( ! isset($data[$key])) ? $val : $data[$key]; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($img_path == '' OR $img_url == '') | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! @is_dir($img_path)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_writable($img_path)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! extension_loaded('gd')) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Remove old images | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		list($usec, $sec) = explode(" ", microtime()); | ||||
| 		$now = ((float)$usec + (float)$sec); | ||||
|  | ||||
| 		$current_dir = @opendir($img_path); | ||||
|  | ||||
| 		while ($filename = @readdir($current_dir)) | ||||
| 		{ | ||||
| 			if ($filename != "." and $filename != ".." and $filename != "index.html") | ||||
| 			{ | ||||
| 				$name = str_replace(".jpg", "", $filename); | ||||
|  | ||||
| 				if (($name + $expiration) < $now) | ||||
| 				{ | ||||
| 					@unlink($img_path.$filename); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		@closedir($current_dir); | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Do we have a "word" yet? | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 	   if ($word == '') | ||||
| 	   { | ||||
| 			$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; | ||||
|  | ||||
| 			$str = ''; | ||||
| 			for ($i = 0; $i < 8; $i++) | ||||
| 			{ | ||||
| 				$str .= substr($pool, mt_rand(0, strlen($pool) -1), 1); | ||||
| 			} | ||||
|  | ||||
| 			$word = $str; | ||||
| 	   } | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Determine angle and position | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$length	= strlen($word); | ||||
| 		$angle	= ($length >= 6) ? rand(-($length-6), ($length-6)) : 0; | ||||
| 		$x_axis	= rand(6, (360/$length)-16); | ||||
| 		$y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height); | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		// Create image | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		// PHP.net recommends imagecreatetruecolor(), but it isn't always available | ||||
| 		if (function_exists('imagecreatetruecolor')) | ||||
| 		{ | ||||
| 			$im = imagecreatetruecolor($img_width, $img_height); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$im = imagecreate($img_width, $img_height); | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		//  Assign colors | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$bg_color		= imagecolorallocate ($im, 255, 255, 255); | ||||
| 		$border_color	= imagecolorallocate ($im, 153, 102, 102); | ||||
| 		$text_color		= imagecolorallocate ($im, 204, 153, 153); | ||||
| 		$grid_color		= imagecolorallocate($im, 255, 182, 182); | ||||
| 		$shadow_color	= imagecolorallocate($im, 255, 240, 240); | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		//  Create the rectangle | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color); | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		//  Create the spiral pattern | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$theta		= 1; | ||||
| 		$thetac		= 7; | ||||
| 		$radius		= 16; | ||||
| 		$circles	= 20; | ||||
| 		$points		= 32; | ||||
|  | ||||
| 		for ($i = 0; $i < ($circles * $points) - 1; $i++) | ||||
| 		{ | ||||
| 			$theta = $theta + $thetac; | ||||
| 			$rad = $radius * ($i / $points ); | ||||
| 			$x = ($rad * cos($theta)) + $x_axis; | ||||
| 			$y = ($rad * sin($theta)) + $y_axis; | ||||
| 			$theta = $theta + $thetac; | ||||
| 			$rad1 = $radius * (($i + 1) / $points); | ||||
| 			$x1 = ($rad1 * cos($theta)) + $x_axis; | ||||
| 			$y1 = ($rad1 * sin($theta )) + $y_axis; | ||||
| 			imageline($im, $x, $y, $x1, $y1, $grid_color); | ||||
| 			$theta = $theta - $thetac; | ||||
| 		} | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		//  Write the text | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; | ||||
|  | ||||
| 		if ($use_font == FALSE) | ||||
| 		{ | ||||
| 			$font_size = 5; | ||||
| 			$x = rand(0, $img_width/($length/3)); | ||||
| 			$y = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$font_size	= 16; | ||||
| 			$x = rand(0, $img_width/($length/1.5)); | ||||
| 			$y = $font_size+2; | ||||
| 		} | ||||
|  | ||||
| 		for ($i = 0; $i < strlen($word); $i++) | ||||
| 		{ | ||||
| 			if ($use_font == FALSE) | ||||
| 			{ | ||||
| 				$y = rand(0 , $img_height/2); | ||||
| 				imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color); | ||||
| 				$x += ($font_size*2); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$y = rand($img_height/2, $img_height-3); | ||||
| 				imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1)); | ||||
| 				$x += $font_size; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		//  Create the border | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color); | ||||
|  | ||||
| 		// ----------------------------------- | ||||
| 		//  Generate the image | ||||
| 		// ----------------------------------- | ||||
|  | ||||
| 		$img_name = $now.'.jpg'; | ||||
|  | ||||
| 		ImageJPEG($im, $img_path.$img_name); | ||||
|  | ||||
| 		$img = "<img src=\"$img_url$img_name\" width=\"$img_width\" height=\"$img_height\" style=\"border:0;\" alt=\" \" />"; | ||||
|  | ||||
| 		ImageDestroy($im); | ||||
|  | ||||
| 		return array('word' => $word, 'time' => $now, 'image' => $img); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /* End of file captcha_helper.php */ | ||||
| /* Location: ./system/heleprs/captcha_helper.php */ | ||||
							
								
								
									
										103
									
								
								system/helpers/cookie_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								system/helpers/cookie_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Cookie Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/cookie_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Set cookie | ||||
|  * | ||||
|  * Accepts six parameter, or you can submit an associative | ||||
|  * array in the first parameter containing all the values. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	mixed | ||||
|  * @param	string	the value of the cookie | ||||
|  * @param	string	the number of seconds until expiration | ||||
|  * @param	string	the cookie domain.  Usually:  .yourdomain.com | ||||
|  * @param	string	the cookie path | ||||
|  * @param	string	the cookie prefix | ||||
|  * @return	void | ||||
|  */ | ||||
| if ( ! function_exists('set_cookie')) | ||||
| { | ||||
| 	function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE) | ||||
| 	{ | ||||
| 		// Set the config file options | ||||
| 		$CI =& get_instance(); | ||||
| 		$CI->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Fetch an item from the COOKIE array | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	bool | ||||
|  * @return	mixed | ||||
|  */ | ||||
| if ( ! function_exists('get_cookie')) | ||||
| { | ||||
| 	function get_cookie($index = '', $xss_clean = FALSE) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
|  | ||||
| 		$prefix = ''; | ||||
|  | ||||
| 		if ( ! isset($_COOKIE[$index]) && config_item('cookie_prefix') != '') | ||||
| 		{ | ||||
| 			$prefix = config_item('cookie_prefix'); | ||||
| 		} | ||||
|  | ||||
| 		return $CI->input->cookie($prefix.$index, $xss_clean); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Delete a COOKIE | ||||
|  * | ||||
|  * @param	mixed | ||||
|  * @param	string	the cookie domain.  Usually:  .yourdomain.com | ||||
|  * @param	string	the cookie path | ||||
|  * @param	string	the cookie prefix | ||||
|  * @return	void | ||||
|  */ | ||||
| if ( ! function_exists('delete_cookie')) | ||||
| { | ||||
| 	function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '') | ||||
| 	{ | ||||
| 		set_cookie($name, '', '', $domain, $path, $prefix); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file cookie_helper.php */ | ||||
| /* Location: ./system/helpers/cookie_helper.php */ | ||||
							
								
								
									
										611
									
								
								system/helpers/date_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										611
									
								
								system/helpers/date_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,611 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Date Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/date_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Get "now" time | ||||
|  * | ||||
|  * Returns time() or its GMT equivalent based on the config file preference | ||||
|  * | ||||
|  * @access	public | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('now')) | ||||
| { | ||||
| 	function now() | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
|  | ||||
| 		if (strtolower($CI->config->item('time_reference')) == 'gmt') | ||||
| 		{ | ||||
| 			$now = time(); | ||||
| 			$system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now)); | ||||
|  | ||||
| 			if (strlen($system_time) < 10) | ||||
| 			{ | ||||
| 				$system_time = time(); | ||||
| 				log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.'); | ||||
| 			} | ||||
|  | ||||
| 			return $system_time; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return time(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Convert MySQL Style Datecodes | ||||
|  * | ||||
|  * This function is identical to PHPs date() function, | ||||
|  * except that it allows date codes to be formatted using | ||||
|  * the MySQL style, where each code letter is preceded | ||||
|  * with a percent sign:  %Y %m %d etc... | ||||
|  * | ||||
|  * The benefit of doing dates this way is that you don't | ||||
|  * have to worry about escaping your text letters that | ||||
|  * match the date codes. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	integer | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('mdate')) | ||||
| { | ||||
| 	function mdate($datestr = '', $time = '') | ||||
| 	{ | ||||
| 		if ($datestr == '') | ||||
| 			return ''; | ||||
|  | ||||
| 		if ($time == '') | ||||
| 			$time = now(); | ||||
|  | ||||
| 		$datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr)); | ||||
| 		return date($datestr, $time); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Standard Date | ||||
|  * | ||||
|  * Returns a date formatted according to the submitted standard. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the chosen format | ||||
|  * @param	integer	Unix timestamp | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('standard_date')) | ||||
| { | ||||
| 	function standard_date($fmt = 'DATE_RFC822', $time = '') | ||||
| 	{ | ||||
| 		$formats = array( | ||||
| 						'DATE_ATOM'		=>	'%Y-%m-%dT%H:%i:%s%Q', | ||||
| 						'DATE_COOKIE'	=>	'%l, %d-%M-%y %H:%i:%s UTC', | ||||
| 						'DATE_ISO8601'	=>	'%Y-%m-%dT%H:%i:%s%Q', | ||||
| 						'DATE_RFC822'	=>	'%D, %d %M %y %H:%i:%s %O', | ||||
| 						'DATE_RFC850'	=>	'%l, %d-%M-%y %H:%i:%s UTC', | ||||
| 						'DATE_RFC1036'	=>	'%D, %d %M %y %H:%i:%s %O', | ||||
| 						'DATE_RFC1123'	=>	'%D, %d %M %Y %H:%i:%s %O', | ||||
| 						'DATE_RSS'		=>	'%D, %d %M %Y %H:%i:%s %O', | ||||
| 						'DATE_W3C'		=>	'%Y-%m-%dT%H:%i:%s%Q' | ||||
| 						); | ||||
|  | ||||
| 		if ( ! isset($formats[$fmt])) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		return mdate($formats[$fmt], $time); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Timespan | ||||
|  * | ||||
|  * Returns a span of seconds in this format: | ||||
|  *	10 days 14 hours 36 minutes 47 seconds | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer	a number of seconds | ||||
|  * @param	integer	Unix timestamp | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('timespan')) | ||||
| { | ||||
| 	function timespan($seconds = 1, $time = '') | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		$CI->lang->load('date'); | ||||
|  | ||||
| 		if ( ! is_numeric($seconds)) | ||||
| 		{ | ||||
| 			$seconds = 1; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_numeric($time)) | ||||
| 		{ | ||||
| 			$time = time(); | ||||
| 		} | ||||
|  | ||||
| 		if ($time <= $seconds) | ||||
| 		{ | ||||
| 			$seconds = 1; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$seconds = $time - $seconds; | ||||
| 		} | ||||
|  | ||||
| 		$str = ''; | ||||
| 		$years = floor($seconds / 31536000); | ||||
|  | ||||
| 		if ($years > 0) | ||||
| 		{ | ||||
| 			$str .= $years.' '.$CI->lang->line((($years	> 1) ? 'date_years' : 'date_year')).', '; | ||||
| 		} | ||||
|  | ||||
| 		$seconds -= $years * 31536000; | ||||
| 		$months = floor($seconds / 2628000); | ||||
|  | ||||
| 		if ($years > 0 OR $months > 0) | ||||
| 		{ | ||||
| 			if ($months > 0) | ||||
| 			{ | ||||
| 				$str .= $months.' '.$CI->lang->line((($months	> 1) ? 'date_months' : 'date_month')).', '; | ||||
| 			} | ||||
|  | ||||
| 			$seconds -= $months * 2628000; | ||||
| 		} | ||||
|  | ||||
| 		$weeks = floor($seconds / 604800); | ||||
|  | ||||
| 		if ($years > 0 OR $months > 0 OR $weeks > 0) | ||||
| 		{ | ||||
| 			if ($weeks > 0) | ||||
| 			{ | ||||
| 				$str .= $weeks.' '.$CI->lang->line((($weeks	> 1) ? 'date_weeks' : 'date_week')).', '; | ||||
| 			} | ||||
|  | ||||
| 			$seconds -= $weeks * 604800; | ||||
| 		} | ||||
|  | ||||
| 		$days = floor($seconds / 86400); | ||||
|  | ||||
| 		if ($months > 0 OR $weeks > 0 OR $days > 0) | ||||
| 		{ | ||||
| 			if ($days > 0) | ||||
| 			{ | ||||
| 				$str .= $days.' '.$CI->lang->line((($days	> 1) ? 'date_days' : 'date_day')).', '; | ||||
| 			} | ||||
|  | ||||
| 			$seconds -= $days * 86400; | ||||
| 		} | ||||
|  | ||||
| 		$hours = floor($seconds / 3600); | ||||
|  | ||||
| 		if ($days > 0 OR $hours > 0) | ||||
| 		{ | ||||
| 			if ($hours > 0) | ||||
| 			{ | ||||
| 				$str .= $hours.' '.$CI->lang->line((($hours	> 1) ? 'date_hours' : 'date_hour')).', '; | ||||
| 			} | ||||
|  | ||||
| 			$seconds -= $hours * 3600; | ||||
| 		} | ||||
|  | ||||
| 		$minutes = floor($seconds / 60); | ||||
|  | ||||
| 		if ($days > 0 OR $hours > 0 OR $minutes > 0) | ||||
| 		{ | ||||
| 			if ($minutes > 0) | ||||
| 			{ | ||||
| 				$str .= $minutes.' '.$CI->lang->line((($minutes	> 1) ? 'date_minutes' : 'date_minute')).', '; | ||||
| 			} | ||||
|  | ||||
| 			$seconds -= $minutes * 60; | ||||
| 		} | ||||
|  | ||||
| 		if ($str == '') | ||||
| 		{ | ||||
| 			$str .= $seconds.' '.$CI->lang->line((($seconds	> 1) ? 'date_seconds' : 'date_second')).', '; | ||||
| 		} | ||||
|  | ||||
| 		return substr(trim($str), 0, -1); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Number of days in a month | ||||
|  * | ||||
|  * Takes a month/year as input and returns the number of days | ||||
|  * for the given month/year. Takes leap years into consideration. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer a numeric month | ||||
|  * @param	integer	a numeric year | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('days_in_month')) | ||||
| { | ||||
| 	function days_in_month($month = 0, $year = '') | ||||
| 	{ | ||||
| 		if ($month < 1 OR $month > 12) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_numeric($year) OR strlen($year) != 4) | ||||
| 		{ | ||||
| 			$year = date('Y'); | ||||
| 		} | ||||
|  | ||||
| 		if ($month == 2) | ||||
| 		{ | ||||
| 			if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) | ||||
| 			{ | ||||
| 				return 29; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$days_in_month	= array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); | ||||
| 		return $days_in_month[$month - 1]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Converts a local Unix timestamp to GMT | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer Unix timestamp | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('local_to_gmt')) | ||||
| { | ||||
| 	function local_to_gmt($time = '') | ||||
| 	{ | ||||
| 		if ($time == '') | ||||
| 			$time = time(); | ||||
|  | ||||
| 		return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time)); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Converts GMT time to a localized value | ||||
|  * | ||||
|  * Takes a Unix timestamp (in GMT) as input, and returns | ||||
|  * at the local value based on the timezone and DST setting | ||||
|  * submitted | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer Unix timestamp | ||||
|  * @param	string	timezone | ||||
|  * @param	bool	whether DST is active | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('gmt_to_local')) | ||||
| { | ||||
| 	function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) | ||||
| 	{ | ||||
| 		if ($time == '') | ||||
| 		{ | ||||
| 			return now(); | ||||
| 		} | ||||
|  | ||||
| 		$time += timezones($timezone) * 3600; | ||||
|  | ||||
| 		if ($dst == TRUE) | ||||
| 		{ | ||||
| 			$time += 3600; | ||||
| 		} | ||||
|  | ||||
| 		return $time; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Converts a MySQL Timestamp to Unix | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer Unix timestamp | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('mysql_to_unix')) | ||||
| { | ||||
| 	function mysql_to_unix($time = '') | ||||
| 	{ | ||||
| 		// We'll remove certain characters for backward compatibility | ||||
| 		// since the formatting changed with MySQL 4.1 | ||||
| 		// YYYY-MM-DD HH:MM:SS | ||||
|  | ||||
| 		$time = str_replace('-', '', $time); | ||||
| 		$time = str_replace(':', '', $time); | ||||
| 		$time = str_replace(' ', '', $time); | ||||
|  | ||||
| 		// YYYYMMDDHHMMSS | ||||
| 		return  mktime( | ||||
| 						substr($time, 8, 2), | ||||
| 						substr($time, 10, 2), | ||||
| 						substr($time, 12, 2), | ||||
| 						substr($time, 4, 2), | ||||
| 						substr($time, 6, 2), | ||||
| 						substr($time, 0, 4) | ||||
| 						); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Unix to "Human" | ||||
|  * | ||||
|  * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer Unix timestamp | ||||
|  * @param	bool	whether to show seconds | ||||
|  * @param	string	format: us or euro | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('unix_to_human')) | ||||
| { | ||||
| 	function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') | ||||
| 	{ | ||||
| 		$r  = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; | ||||
|  | ||||
| 		if ($fmt == 'us') | ||||
| 		{ | ||||
| 			$r .= date('h', $time).':'.date('i', $time); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$r .= date('H', $time).':'.date('i', $time); | ||||
| 		} | ||||
|  | ||||
| 		if ($seconds) | ||||
| 		{ | ||||
| 			$r .= ':'.date('s', $time); | ||||
| 		} | ||||
|  | ||||
| 		if ($fmt == 'us') | ||||
| 		{ | ||||
| 			$r .= ' '.date('A', $time); | ||||
| 		} | ||||
|  | ||||
| 		return $r; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Convert "human" date to GMT | ||||
|  * | ||||
|  * Reverses the above process | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	format: us or euro | ||||
|  * @return	integer | ||||
|  */ | ||||
| if ( ! function_exists('human_to_unix')) | ||||
| { | ||||
| 	function human_to_unix($datestr = '') | ||||
| 	{ | ||||
| 		if ($datestr == '') | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$datestr = trim($datestr); | ||||
| 		$datestr = preg_replace("/\040+/", ' ', $datestr); | ||||
|  | ||||
| 		if ( ! preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		$split = explode(' ', $datestr); | ||||
|  | ||||
| 		$ex = explode("-", $split['0']); | ||||
|  | ||||
| 		$year  = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0']; | ||||
| 		$month = (strlen($ex['1']) == 1) ? '0'.$ex['1']  : $ex['1']; | ||||
| 		$day   = (strlen($ex['2']) == 1) ? '0'.$ex['2']  : $ex['2']; | ||||
|  | ||||
| 		$ex = explode(":", $split['1']); | ||||
|  | ||||
| 		$hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0']; | ||||
| 		$min  = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; | ||||
|  | ||||
| 		if (isset($ex['2']) && preg_match('/[0-9]{1,2}/', $ex['2'])) | ||||
| 		{ | ||||
| 			$sec  = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// Unless specified, seconds get set to zero. | ||||
| 			$sec = '00'; | ||||
| 		} | ||||
|  | ||||
| 		if (isset($split['2'])) | ||||
| 		{ | ||||
| 			$ampm = strtolower($split['2']); | ||||
|  | ||||
| 			if (substr($ampm, 0, 1) == 'p' AND $hour < 12) | ||||
| 				$hour = $hour + 12; | ||||
|  | ||||
| 			if (substr($ampm, 0, 1) == 'a' AND $hour == 12) | ||||
| 				$hour =  '00'; | ||||
|  | ||||
| 			if (strlen($hour) == 1) | ||||
| 				$hour = '0'.$hour; | ||||
| 		} | ||||
|  | ||||
| 		return mktime($hour, $min, $sec, $month, $day, $year); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Timezone Menu | ||||
|  * | ||||
|  * Generates a drop-down menu of timezones. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	timezone | ||||
|  * @param	string	classname | ||||
|  * @param	string	menu name | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('timezone_menu')) | ||||
| { | ||||
| 	function timezone_menu($default = 'UTC', $class = "", $name = 'timezones') | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		$CI->lang->load('date'); | ||||
|  | ||||
| 		if ($default == 'GMT') | ||||
| 			$default = 'UTC'; | ||||
|  | ||||
| 		$menu = '<select name="'.$name.'"'; | ||||
|  | ||||
| 		if ($class != '') | ||||
| 		{ | ||||
| 			$menu .= ' class="'.$class.'"'; | ||||
| 		} | ||||
|  | ||||
| 		$menu .= ">\n"; | ||||
|  | ||||
| 		foreach (timezones() as $key => $val) | ||||
| 		{ | ||||
| 			$selected = ($default == $key) ? " selected='selected'" : ''; | ||||
| 			$menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n"; | ||||
| 		} | ||||
|  | ||||
| 		$menu .= "</select>"; | ||||
|  | ||||
| 		return $menu; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Timezones | ||||
|  * | ||||
|  * Returns an array of timezones.  This is a helper function | ||||
|  * for various other ones in this library | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	timezone | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('timezones')) | ||||
| { | ||||
| 	function timezones($tz = '') | ||||
| 	{ | ||||
| 		// Note: Don't change the order of these even though | ||||
| 		// some items appear to be in the wrong order | ||||
|  | ||||
| 		$zones = array( | ||||
| 						'UM12'		=> -12, | ||||
| 						'UM11'		=> -11, | ||||
| 						'UM10'		=> -10, | ||||
| 						'UM95'		=> -9.5, | ||||
| 						'UM9'		=> -9, | ||||
| 						'UM8'		=> -8, | ||||
| 						'UM7'		=> -7, | ||||
| 						'UM6'		=> -6, | ||||
| 						'UM5'		=> -5, | ||||
| 						'UM45'		=> -4.5, | ||||
| 						'UM4'		=> -4, | ||||
| 						'UM35'		=> -3.5, | ||||
| 						'UM3'		=> -3, | ||||
| 						'UM2'		=> -2, | ||||
| 						'UM1'		=> -1, | ||||
| 						'UTC'		=> 0, | ||||
| 						'UP1'		=> +1, | ||||
| 						'UP2'		=> +2, | ||||
| 						'UP3'		=> +3, | ||||
| 						'UP35'		=> +3.5, | ||||
| 						'UP4'		=> +4, | ||||
| 						'UP45'		=> +4.5, | ||||
| 						'UP5'		=> +5, | ||||
| 						'UP55'		=> +5.5, | ||||
| 						'UP575'		=> +5.75, | ||||
| 						'UP6'		=> +6, | ||||
| 						'UP65'		=> +6.5, | ||||
| 						'UP7'		=> +7, | ||||
| 						'UP8'		=> +8, | ||||
| 						'UP875'		=> +8.75, | ||||
| 						'UP9'		=> +9, | ||||
| 						'UP95'		=> +9.5, | ||||
| 						'UP10'		=> +10, | ||||
| 						'UP105'		=> +10.5, | ||||
| 						'UP11'		=> +11, | ||||
| 						'UP115'		=> +11.5, | ||||
| 						'UP12'		=> +12, | ||||
| 						'UP1275'	=> +12.75, | ||||
| 						'UP13'		=> +13, | ||||
| 						'UP14'		=> +14 | ||||
| 					); | ||||
|  | ||||
| 		if ($tz == '') | ||||
| 		{ | ||||
| 			return $zones; | ||||
| 		} | ||||
|  | ||||
| 		if ($tz == 'GMT') | ||||
| 			$tz = 'UTC'; | ||||
|  | ||||
| 		return ( ! isset($zones[$tz])) ? 0 : $zones[$tz]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file date_helper.php */ | ||||
| /* Location: ./system/helpers/date_helper.php */ | ||||
							
								
								
									
										80
									
								
								system/helpers/directory_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								system/helpers/directory_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Directory Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/directory_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Create a Directory Map | ||||
|  * | ||||
|  * Reads the specified directory and builds an array | ||||
|  * representation of it.  Sub-folders contained with the | ||||
|  * directory will be mapped as well. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to source | ||||
|  * @param	int		depth of directories to traverse (0 = fully recursive, 1 = current dir, etc) | ||||
|  * @return	array | ||||
|  */ | ||||
| if ( ! function_exists('directory_map')) | ||||
| { | ||||
| 	function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE) | ||||
| 	{ | ||||
| 		if ($fp = @opendir($source_dir)) | ||||
| 		{ | ||||
| 			$filedata	= array(); | ||||
| 			$new_depth	= $directory_depth - 1; | ||||
| 			$source_dir	= rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; | ||||
|  | ||||
| 			while (FALSE !== ($file = readdir($fp))) | ||||
| 			{ | ||||
| 				// Remove '.', '..', and hidden files [optional] | ||||
| 				if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.')) | ||||
| 				{ | ||||
| 					continue; | ||||
| 				} | ||||
|  | ||||
| 				if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file)) | ||||
| 				{ | ||||
| 					$filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$filedata[] = $file; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			closedir($fp); | ||||
| 			return $filedata; | ||||
| 		} | ||||
|  | ||||
| 		return FALSE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file directory_helper.php */ | ||||
| /* Location: ./system/helpers/directory_helper.php */ | ||||
							
								
								
									
										107
									
								
								system/helpers/download_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								system/helpers/download_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Download Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/download_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Force Download | ||||
|  * | ||||
|  * Generates headers that force a download to happen | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	filename | ||||
|  * @param	mixed	the data to be downloaded | ||||
|  * @return	void | ||||
|  */ | ||||
| if ( ! function_exists('force_download')) | ||||
| { | ||||
| 	function force_download($filename = '', $data = '') | ||||
| 	{ | ||||
| 		if ($filename == '' OR $data == '') | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// Try to determine if the filename includes a file extension. | ||||
| 		// We need it in order to set the MIME type | ||||
| 		if (FALSE === strpos($filename, '.')) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		// Grab the file extension | ||||
| 		$x = explode('.', $filename); | ||||
| 		$extension = end($x); | ||||
|  | ||||
| 		// Load the mime types | ||||
| 		if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); | ||||
| 		} | ||||
| 		elseif (is_file(APPPATH.'config/mimes.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/mimes.php'); | ||||
| 		} | ||||
|  | ||||
| 		// Set a default mime if we can't find it | ||||
| 		if ( ! isset($mimes[$extension])) | ||||
| 		{ | ||||
| 			$mime = 'application/octet-stream'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension]; | ||||
| 		} | ||||
|  | ||||
| 		// Generate the server headers | ||||
| 		if (strpos($_SERVER['HTTP_USER_AGENT'], "MSIE") !== FALSE) | ||||
| 		{ | ||||
| 			header('Content-Type: "'.$mime.'"'); | ||||
| 			header('Content-Disposition: attachment; filename="'.$filename.'"'); | ||||
| 			header('Expires: 0'); | ||||
| 			header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); | ||||
| 			header("Content-Transfer-Encoding: binary"); | ||||
| 			header('Pragma: public'); | ||||
| 			header("Content-Length: ".strlen($data)); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			header('Content-Type: "'.$mime.'"'); | ||||
| 			header('Content-Disposition: attachment; filename="'.$filename.'"'); | ||||
| 			header("Content-Transfer-Encoding: binary"); | ||||
| 			header('Expires: 0'); | ||||
| 			header('Pragma: no-cache'); | ||||
| 			header("Content-Length: ".strlen($data)); | ||||
| 		} | ||||
|  | ||||
| 		exit($data); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file download_helper.php */ | ||||
| /* Location: ./system/helpers/download_helper.php */ | ||||
							
								
								
									
										62
									
								
								system/helpers/email_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								system/helpers/email_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Email Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/email_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Validate email address | ||||
|  * | ||||
|  * @access	public | ||||
|  * @return	bool | ||||
|  */ | ||||
| if ( ! function_exists('valid_email')) | ||||
| { | ||||
| 	function valid_email($address) | ||||
| 	{ | ||||
| 		return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Send an email | ||||
|  * | ||||
|  * @access	public | ||||
|  * @return	bool | ||||
|  */ | ||||
| if ( ! function_exists('send_email')) | ||||
| { | ||||
| 	function send_email($recipient, $subject = 'Test email', $message = 'Hello World') | ||||
| 	{ | ||||
| 		return mail($recipient, $subject, $message); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file email_helper.php */ | ||||
| /* Location: ./system/helpers/email_helper.php */ | ||||
							
								
								
									
										479
									
								
								system/helpers/file_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								system/helpers/file_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,479 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter File Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/file_helpers.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Read File | ||||
|  * | ||||
|  * Opens the file specfied in the path and returns it as a string. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to file | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('read_file')) | ||||
| { | ||||
| 	function read_file($file) | ||||
| 	{ | ||||
| 		if ( ! file_exists($file)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if (function_exists('file_get_contents')) | ||||
| 		{ | ||||
| 			return file_get_contents($file); | ||||
| 		} | ||||
|  | ||||
| 		if ( ! $fp = @fopen($file, FOPEN_READ)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		flock($fp, LOCK_SH); | ||||
|  | ||||
| 		$data = ''; | ||||
| 		if (filesize($file) > 0) | ||||
| 		{ | ||||
| 			$data =& fread($fp, filesize($file)); | ||||
| 		} | ||||
|  | ||||
| 		flock($fp, LOCK_UN); | ||||
| 		fclose($fp); | ||||
|  | ||||
| 		return $data; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Write File | ||||
|  * | ||||
|  * Writes data to the file specified in the path. | ||||
|  * Creates a new file if non-existent. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to file | ||||
|  * @param	string	file data | ||||
|  * @return	bool | ||||
|  */ | ||||
| if ( ! function_exists('write_file')) | ||||
| { | ||||
| 	function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE) | ||||
| 	{ | ||||
| 		if ( ! $fp = @fopen($path, $mode)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		flock($fp, LOCK_EX); | ||||
| 		fwrite($fp, $data); | ||||
| 		flock($fp, LOCK_UN); | ||||
| 		fclose($fp); | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Delete Files | ||||
|  * | ||||
|  * Deletes all files contained in the supplied directory path. | ||||
|  * Files must be writable or owned by the system in order to be deleted. | ||||
|  * If the second parameter is set to TRUE, any directories contained | ||||
|  * within the supplied base directory will be nuked as well. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to file | ||||
|  * @param	bool	whether to delete any directories found in the path | ||||
|  * @return	bool | ||||
|  */ | ||||
| if ( ! function_exists('delete_files')) | ||||
| { | ||||
| 	function delete_files($path, $del_dir = FALSE, $level = 0) | ||||
| 	{ | ||||
| 		// Trim the trailing slash | ||||
| 		$path = rtrim($path, DIRECTORY_SEPARATOR); | ||||
|  | ||||
| 		if ( ! $current_dir = @opendir($path)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		while (FALSE !== ($filename = @readdir($current_dir))) | ||||
| 		{ | ||||
| 			if ($filename != "." and $filename != "..") | ||||
| 			{ | ||||
| 				if (is_dir($path.DIRECTORY_SEPARATOR.$filename)) | ||||
| 				{ | ||||
| 					// Ignore empty folders | ||||
| 					if (substr($filename, 0, 1) != '.') | ||||
| 					{ | ||||
| 						delete_files($path.DIRECTORY_SEPARATOR.$filename, $del_dir, $level + 1); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					unlink($path.DIRECTORY_SEPARATOR.$filename); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		@closedir($current_dir); | ||||
|  | ||||
| 		if ($del_dir == TRUE AND $level > 0) | ||||
| 		{ | ||||
| 			return @rmdir($path); | ||||
| 		} | ||||
|  | ||||
| 		return TRUE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Get Filenames | ||||
|  * | ||||
|  * Reads the specified directory and builds an array containing the filenames. | ||||
|  * Any sub-folders contained within the specified path are read as well. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to source | ||||
|  * @param	bool	whether to include the path as part of the filename | ||||
|  * @param	bool	internal variable to determine recursion status - do not use in calls | ||||
|  * @return	array | ||||
|  */ | ||||
| if ( ! function_exists('get_filenames')) | ||||
| { | ||||
| 	function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) | ||||
| 	{ | ||||
| 		static $_filedata = array(); | ||||
|  | ||||
| 		if ($fp = @opendir($source_dir)) | ||||
| 		{ | ||||
| 			// reset the array and make sure $source_dir has a trailing slash on the initial call | ||||
| 			if ($_recursion === FALSE) | ||||
| 			{ | ||||
| 				$_filedata = array(); | ||||
| 				$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; | ||||
| 			} | ||||
|  | ||||
| 			while (FALSE !== ($file = readdir($fp))) | ||||
| 			{ | ||||
| 				if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0) | ||||
| 				{ | ||||
| 					get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); | ||||
| 				} | ||||
| 				elseif (strncmp($file, '.', 1) !== 0) | ||||
| 				{ | ||||
| 					$_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file; | ||||
| 				} | ||||
| 			} | ||||
| 			return $_filedata; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Get Directory File Information | ||||
|  * | ||||
|  * Reads the specified directory and builds an array containing the filenames, | ||||
|  * filesize, dates, and permissions | ||||
|  * | ||||
|  * Any sub-folders contained within the specified path are read as well. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to source | ||||
|  * @param	bool	Look only at the top level directory specified? | ||||
|  * @param	bool	internal variable to determine recursion status - do not use in calls | ||||
|  * @return	array | ||||
|  */ | ||||
| if ( ! function_exists('get_dir_file_info')) | ||||
| { | ||||
| 	function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) | ||||
| 	{ | ||||
| 		static $_filedata = array(); | ||||
| 		$relative_path = $source_dir; | ||||
|  | ||||
| 		if ($fp = @opendir($source_dir)) | ||||
| 		{ | ||||
| 			// reset the array and make sure $source_dir has a trailing slash on the initial call | ||||
| 			if ($_recursion === FALSE) | ||||
| 			{ | ||||
| 				$_filedata = array(); | ||||
| 				$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; | ||||
| 			} | ||||
|  | ||||
| 			// foreach (scandir($source_dir, 1) as $file) // In addition to being PHP5+, scandir() is simply not as fast | ||||
| 			while (FALSE !== ($file = readdir($fp))) | ||||
| 			{ | ||||
| 				if (@is_dir($source_dir.$file) AND strncmp($file, '.', 1) !== 0 AND $top_level_only === FALSE) | ||||
| 				{ | ||||
| 					get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); | ||||
| 				} | ||||
| 				elseif (strncmp($file, '.', 1) !== 0) | ||||
| 				{ | ||||
| 					$_filedata[$file] = get_file_info($source_dir.$file); | ||||
| 					$_filedata[$file]['relative_path'] = $relative_path; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			return $_filedata; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
| * Get File Info | ||||
| * | ||||
| * Given a file and path, returns the name, path, size, date modified | ||||
| * Second parameter allows you to explicitly declare what information you want returned | ||||
| * Options are: name, server_path, size, date, readable, writable, executable, fileperms | ||||
| * Returns FALSE if the file cannot be found. | ||||
| * | ||||
| * @access	public | ||||
| * @param	string	path to file | ||||
| * @param	mixed	array or comma separated string of information returned | ||||
| * @return	array | ||||
| */ | ||||
| if ( ! function_exists('get_file_info')) | ||||
| { | ||||
| 	function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) | ||||
| 	{ | ||||
|  | ||||
| 		if ( ! file_exists($file)) | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  | ||||
| 		if (is_string($returned_values)) | ||||
| 		{ | ||||
| 			$returned_values = explode(',', $returned_values); | ||||
| 		} | ||||
|  | ||||
| 		foreach ($returned_values as $key) | ||||
| 		{ | ||||
| 			switch ($key) | ||||
| 			{ | ||||
| 				case 'name': | ||||
| 					$fileinfo['name'] = substr(strrchr($file, DIRECTORY_SEPARATOR), 1); | ||||
| 					break; | ||||
| 				case 'server_path': | ||||
| 					$fileinfo['server_path'] = $file; | ||||
| 					break; | ||||
| 				case 'size': | ||||
| 					$fileinfo['size'] = filesize($file); | ||||
| 					break; | ||||
| 				case 'date': | ||||
| 					$fileinfo['date'] = filemtime($file); | ||||
| 					break; | ||||
| 				case 'readable': | ||||
| 					$fileinfo['readable'] = is_readable($file); | ||||
| 					break; | ||||
| 				case 'writable': | ||||
| 					// There are known problems using is_weritable on IIS.  It may not be reliable - consider fileperms() | ||||
| 					$fileinfo['writable'] = is_writable($file); | ||||
| 					break; | ||||
| 				case 'executable': | ||||
| 					$fileinfo['executable'] = is_executable($file); | ||||
| 					break; | ||||
| 				case 'fileperms': | ||||
| 					$fileinfo['fileperms'] = fileperms($file); | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $fileinfo; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Get Mime by Extension | ||||
|  * | ||||
|  * Translates a file extension into a mime type based on config/mimes.php. | ||||
|  * Returns FALSE if it can't determine the type, or open the mime config file | ||||
|  * | ||||
|  * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience | ||||
|  * It should NOT be trusted, and should certainly NOT be used for security | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	path to file | ||||
|  * @return	mixed | ||||
|  */ | ||||
| if ( ! function_exists('get_mime_by_extension')) | ||||
| { | ||||
| 	function get_mime_by_extension($file) | ||||
| 	{ | ||||
| 		$extension = strtolower(substr(strrchr($file, '.'), 1)); | ||||
|  | ||||
| 		global $mimes; | ||||
|  | ||||
| 		if ( ! is_array($mimes)) | ||||
| 		{ | ||||
| 			if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) | ||||
| 			{ | ||||
| 				include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); | ||||
| 			} | ||||
| 			elseif (is_file(APPPATH.'config/mimes.php')) | ||||
| 			{ | ||||
| 				include(APPPATH.'config/mimes.php'); | ||||
| 			} | ||||
|  | ||||
| 			if ( ! is_array($mimes)) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (array_key_exists($extension, $mimes)) | ||||
| 		{ | ||||
| 			if (is_array($mimes[$extension])) | ||||
| 			{ | ||||
| 				// Multiple mime types, just give the first one | ||||
| 				return current($mimes[$extension]); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				return $mimes[$extension]; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Symbolic Permissions | ||||
|  * | ||||
|  * Takes a numeric value representing a file's permissions and returns | ||||
|  * standard symbolic notation representing that value | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	int | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('symbolic_permissions')) | ||||
| { | ||||
| 	function symbolic_permissions($perms) | ||||
| 	{ | ||||
| 		if (($perms & 0xC000) == 0xC000) | ||||
| 		{ | ||||
| 			$symbolic = 's'; // Socket | ||||
| 		} | ||||
| 		elseif (($perms & 0xA000) == 0xA000) | ||||
| 		{ | ||||
| 			$symbolic = 'l'; // Symbolic Link | ||||
| 		} | ||||
| 		elseif (($perms & 0x8000) == 0x8000) | ||||
| 		{ | ||||
| 			$symbolic = '-'; // Regular | ||||
| 		} | ||||
| 		elseif (($perms & 0x6000) == 0x6000) | ||||
| 		{ | ||||
| 			$symbolic = 'b'; // Block special | ||||
| 		} | ||||
| 		elseif (($perms & 0x4000) == 0x4000) | ||||
| 		{ | ||||
| 			$symbolic = 'd'; // Directory | ||||
| 		} | ||||
| 		elseif (($perms & 0x2000) == 0x2000) | ||||
| 		{ | ||||
| 			$symbolic = 'c'; // Character special | ||||
| 		} | ||||
| 		elseif (($perms & 0x1000) == 0x1000) | ||||
| 		{ | ||||
| 			$symbolic = 'p'; // FIFO pipe | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$symbolic = 'u'; // Unknown | ||||
| 		} | ||||
|  | ||||
| 		// Owner | ||||
| 		$symbolic .= (($perms & 0x0100) ? 'r' : '-'); | ||||
| 		$symbolic .= (($perms & 0x0080) ? 'w' : '-'); | ||||
| 		$symbolic .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); | ||||
|  | ||||
| 		// Group | ||||
| 		$symbolic .= (($perms & 0x0020) ? 'r' : '-'); | ||||
| 		$symbolic .= (($perms & 0x0010) ? 'w' : '-'); | ||||
| 		$symbolic .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); | ||||
|  | ||||
| 		// World | ||||
| 		$symbolic .= (($perms & 0x0004) ? 'r' : '-'); | ||||
| 		$symbolic .= (($perms & 0x0002) ? 'w' : '-'); | ||||
| 		$symbolic .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); | ||||
|  | ||||
| 		return $symbolic; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Octal Permissions | ||||
|  * | ||||
|  * Takes a numeric value representing a file's permissions and returns | ||||
|  * a three character string representing the file's octal permissions | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	int | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('octal_permissions')) | ||||
| { | ||||
| 	function octal_permissions($perms) | ||||
| 	{ | ||||
| 		return substr(sprintf('%o', $perms), -3); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file file_helper.php */ | ||||
| /* Location: ./system/helpers/file_helper.php */ | ||||
							
								
								
									
										1054
									
								
								system/helpers/form_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1054
									
								
								system/helpers/form_helper.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										436
									
								
								system/helpers/html_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										436
									
								
								system/helpers/html_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,436 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter HTML Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/html_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Heading | ||||
|  * | ||||
|  * Generates an HTML heading tag.  First param is the data. | ||||
|  * Second param is the size of the heading tag. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	integer | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('heading')) | ||||
| { | ||||
| 	function heading($data = '', $h = '1', $attributes = '') | ||||
| 	{ | ||||
| 		$attributes = ($attributes != '') ? ' '.$attributes : $attributes; | ||||
| 		return "<h".$h.$attributes.">".$data."</h".$h.">"; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Unordered List | ||||
|  * | ||||
|  * Generates an HTML unordered list from an single or multi-dimensional array. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	array | ||||
|  * @param	mixed | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('ul')) | ||||
| { | ||||
| 	function ul($list, $attributes = '') | ||||
| 	{ | ||||
| 		return _list('ul', $list, $attributes); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Ordered List | ||||
|  * | ||||
|  * Generates an HTML ordered list from an single or multi-dimensional array. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	array | ||||
|  * @param	mixed | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('ol')) | ||||
| { | ||||
| 	function ol($list, $attributes = '') | ||||
| 	{ | ||||
| 		return _list('ol', $list, $attributes); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Generates the list | ||||
|  * | ||||
|  * Generates an HTML ordered list from an single or multi-dimensional array. | ||||
|  * | ||||
|  * @access	private | ||||
|  * @param	string | ||||
|  * @param	mixed | ||||
|  * @param	mixed | ||||
|  * @param	integer | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('_list')) | ||||
| { | ||||
| 	function _list($type = 'ul', $list, $attributes = '', $depth = 0) | ||||
| 	{ | ||||
| 		// If an array wasn't submitted there's nothing to do... | ||||
| 		if ( ! is_array($list)) | ||||
| 		{ | ||||
| 			return $list; | ||||
| 		} | ||||
|  | ||||
| 		// Set the indentation based on the depth | ||||
| 		$out = str_repeat(" ", $depth); | ||||
|  | ||||
| 		// Were any attributes submitted?  If so generate a string | ||||
| 		if (is_array($attributes)) | ||||
| 		{ | ||||
| 			$atts = ''; | ||||
| 			foreach ($attributes as $key => $val) | ||||
| 			{ | ||||
| 				$atts .= ' ' . $key . '="' . $val . '"'; | ||||
| 			} | ||||
| 			$attributes = $atts; | ||||
| 		} | ||||
| 		elseif (is_string($attributes) AND strlen($attributes) > 0) | ||||
| 		{ | ||||
| 			$attributes = ' '. $attributes; | ||||
| 		} | ||||
|  | ||||
| 		// Write the opening list tag | ||||
| 		$out .= "<".$type.$attributes.">\n"; | ||||
|  | ||||
| 		// Cycle through the list elements.  If an array is | ||||
| 		// encountered we will recursively call _list() | ||||
|  | ||||
| 		static $_last_list_item = ''; | ||||
| 		foreach ($list as $key => $val) | ||||
| 		{ | ||||
| 			$_last_list_item = $key; | ||||
|  | ||||
| 			$out .= str_repeat(" ", $depth + 2); | ||||
| 			$out .= "<li>"; | ||||
|  | ||||
| 			if ( ! is_array($val)) | ||||
| 			{ | ||||
| 				$out .= $val; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$out .= $_last_list_item."\n"; | ||||
| 				$out .= _list($type, $val, '', $depth + 4); | ||||
| 				$out .= str_repeat(" ", $depth + 2); | ||||
| 			} | ||||
|  | ||||
| 			$out .= "</li>\n"; | ||||
| 		} | ||||
|  | ||||
| 		// Set the indentation for the closing tag | ||||
| 		$out .= str_repeat(" ", $depth); | ||||
|  | ||||
| 		// Write the closing list tag | ||||
| 		$out .= "</".$type.">\n"; | ||||
|  | ||||
| 		return $out; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Generates HTML BR tags based on number supplied | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('br')) | ||||
| { | ||||
| 	function br($num = 1) | ||||
| 	{ | ||||
| 		return str_repeat("<br />", $num); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Image | ||||
|  * | ||||
|  * Generates an <img /> element | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	mixed | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('img')) | ||||
| { | ||||
| 	function img($src = '', $index_page = FALSE) | ||||
| 	{ | ||||
| 		if ( ! is_array($src) ) | ||||
| 		{ | ||||
| 			$src = array('src' => $src); | ||||
| 		} | ||||
|  | ||||
| 		// If there is no alt attribute defined, set it to an empty string | ||||
| 		if ( ! isset($src['alt'])) | ||||
| 		{ | ||||
| 			$src['alt'] = ''; | ||||
| 		} | ||||
|  | ||||
| 		$img = '<img'; | ||||
|  | ||||
| 		foreach ($src as $k=>$v) | ||||
| 		{ | ||||
|  | ||||
| 			if ($k == 'src' AND strpos($v, '://') === FALSE) | ||||
| 			{ | ||||
| 				$CI =& get_instance(); | ||||
|  | ||||
| 				if ($index_page === TRUE) | ||||
| 				{ | ||||
| 					$img .= ' src="'.$CI->config->site_url($v).'"'; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$img .= ' src="'.$CI->config->slash_item('base_url').$v.'"'; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$img .= " $k=\"$v\""; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$img .= '/>'; | ||||
|  | ||||
| 		return $img; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Doctype | ||||
|  * | ||||
|  * Generates a page document type declaration | ||||
|  * | ||||
|  * Valid options are xhtml-11, xhtml-strict, xhtml-trans, xhtml-frame, | ||||
|  * html4-strict, html4-trans, and html4-frame.  Values are saved in the | ||||
|  * doctypes config file. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	type	The doctype to be generated | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('doctype')) | ||||
| { | ||||
| 	function doctype($type = 'xhtml1-strict') | ||||
| 	{ | ||||
| 		global $_doctypes; | ||||
|  | ||||
| 		if ( ! is_array($_doctypes)) | ||||
| 		{ | ||||
| 			if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) | ||||
| 			{ | ||||
| 				include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'); | ||||
| 			} | ||||
| 			elseif (is_file(APPPATH.'config/doctypes.php')) | ||||
| 			{ | ||||
| 				include(APPPATH.'config/doctypes.php'); | ||||
| 			} | ||||
|  | ||||
| 			if ( ! is_array($_doctypes)) | ||||
| 			{ | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (isset($_doctypes[$type])) | ||||
| 		{ | ||||
| 			return $_doctypes[$type]; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return FALSE; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Link | ||||
|  * | ||||
|  * Generates link to a CSS file | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	mixed	stylesheet hrefs or an array | ||||
|  * @param	string	rel | ||||
|  * @param	string	type | ||||
|  * @param	string	title | ||||
|  * @param	string	media | ||||
|  * @param	boolean	should index_page be added to the css path | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('link_tag')) | ||||
| { | ||||
| 	function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = '', $media = '', $index_page = FALSE) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
|  | ||||
| 		$link = '<link '; | ||||
|  | ||||
| 		if (is_array($href)) | ||||
| 		{ | ||||
| 			foreach ($href as $k=>$v) | ||||
| 			{ | ||||
| 				if ($k == 'href' AND strpos($v, '://') === FALSE) | ||||
| 				{ | ||||
| 					if ($index_page === TRUE) | ||||
| 					{ | ||||
| 						$link .= 'href="'.$CI->config->site_url($v).'" '; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						$link .= 'href="'.$CI->config->slash_item('base_url').$v.'" '; | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$link .= "$k=\"$v\" "; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			$link .= "/>"; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if ( strpos($href, '://') !== FALSE) | ||||
| 			{ | ||||
| 				$link .= 'href="'.$href.'" '; | ||||
| 			} | ||||
| 			elseif ($index_page === TRUE) | ||||
| 			{ | ||||
| 				$link .= 'href="'.$CI->config->site_url($href).'" '; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$link .= 'href="'.$CI->config->slash_item('base_url').$href.'" '; | ||||
| 			} | ||||
|  | ||||
| 			$link .= 'rel="'.$rel.'" type="'.$type.'" '; | ||||
|  | ||||
| 			if ($media	!= '') | ||||
| 			{ | ||||
| 				$link .= 'media="'.$media.'" '; | ||||
| 			} | ||||
|  | ||||
| 			if ($title	!= '') | ||||
| 			{ | ||||
| 				$link .= 'title="'.$title.'" '; | ||||
| 			} | ||||
|  | ||||
| 			$link .= '/>'; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		return $link; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Generates meta tags from an array of key/values | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	array | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('meta')) | ||||
| { | ||||
| 	function meta($name = '', $content = '', $type = 'name', $newline = "\n") | ||||
| 	{ | ||||
| 		// Since we allow the data to be passes as a string, a simple array | ||||
| 		// or a multidimensional one, we need to do a little prepping. | ||||
| 		if ( ! is_array($name)) | ||||
| 		{ | ||||
| 			$name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline)); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// Turn single array into multidimensional | ||||
| 			if (isset($name['name'])) | ||||
| 			{ | ||||
| 				$name = array($name); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$str = ''; | ||||
| 		foreach ($name as $meta) | ||||
| 		{ | ||||
| 			$type		= ( ! isset($meta['type']) OR $meta['type'] == 'name') ? 'name' : 'http-equiv'; | ||||
| 			$name		= ( ! isset($meta['name']))		? ''	: $meta['name']; | ||||
| 			$content	= ( ! isset($meta['content']))	? ''	: $meta['content']; | ||||
| 			$newline	= ( ! isset($meta['newline']))	? "\n"	: $meta['newline']; | ||||
|  | ||||
| 			$str .= '<meta '.$type.'="'.$name.'" content="'.$content.'" />'.$newline; | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Generates non-breaking space entities based on number supplied | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	integer | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('nbs')) | ||||
| { | ||||
| 	function nbs($num = 1) | ||||
| 	{ | ||||
| 		return str_repeat(" ", $num); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file html_helper.php */ | ||||
| /* Location: ./system/helpers/html_helper.php */ | ||||
							
								
								
									
										10
									
								
								system/helpers/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								system/helpers/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <html> | ||||
| <head> | ||||
| 	<title>403 Forbidden</title> | ||||
| </head> | ||||
| <body> | ||||
|  | ||||
| <p>Directory access is forbidden.</p> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										203
									
								
								system/helpers/inflector_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								system/helpers/inflector_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Inflector Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/directory_helper.html | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Singular | ||||
|  * | ||||
|  * Takes a plural word and makes it singular | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	str | ||||
|  */ | ||||
| if ( ! function_exists('singular')) | ||||
| { | ||||
| 	function singular($str) | ||||
| 	{ | ||||
| 		$result = strval($str); | ||||
|  | ||||
| 		$singular_rules = array( | ||||
| 			'/(matr)ices$/'         => '\1ix', | ||||
| 			'/(vert|ind)ices$/'     => '\1ex', | ||||
| 			'/^(ox)en/'             => '\1', | ||||
| 			'/(alias)es$/'          => '\1', | ||||
| 			'/([octop|vir])i$/'     => '\1us', | ||||
| 			'/(cris|ax|test)es$/'   => '\1is', | ||||
| 			'/(shoe)s$/'            => '\1', | ||||
| 			'/(o)es$/'              => '\1', | ||||
| 			'/(bus|campus)es$/'     => '\1', | ||||
| 			'/([m|l])ice$/'         => '\1ouse', | ||||
| 			'/(x|ch|ss|sh)es$/'     => '\1', | ||||
| 			'/(m)ovies$/'           => '\1\2ovie', | ||||
| 			'/(s)eries$/'           => '\1\2eries', | ||||
| 			'/([^aeiouy]|qu)ies$/'  => '\1y', | ||||
| 			'/([lr])ves$/'          => '\1f', | ||||
| 			'/(tive)s$/'            => '\1', | ||||
| 			'/(hive)s$/'            => '\1', | ||||
| 			'/([^f])ves$/'          => '\1fe', | ||||
| 			'/(^analy)ses$/'        => '\1sis', | ||||
| 			'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/' => '\1\2sis', | ||||
| 			'/([ti])a$/'            => '\1um', | ||||
| 			'/(p)eople$/'           => '\1\2erson', | ||||
| 			'/(m)en$/'              => '\1an', | ||||
| 			'/(s)tatuses$/'         => '\1\2tatus', | ||||
| 			'/(c)hildren$/'         => '\1\2hild', | ||||
| 			'/(n)ews$/'             => '\1\2ews', | ||||
| 			'/([^u])s$/'            => '\1', | ||||
| 		); | ||||
| 		 | ||||
| 		foreach ($singular_rules as $rule => $replacement) | ||||
| 		{ | ||||
| 			if (preg_match($rule, $result)) | ||||
| 			{ | ||||
| 				$result = preg_replace($rule, $replacement, $result); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $result; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Plural | ||||
|  * | ||||
|  * Takes a singular word and makes it plural | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	bool | ||||
|  * @return	str | ||||
|  */ | ||||
| if ( ! function_exists('plural')) | ||||
| { | ||||
| 	function plural($str, $force = FALSE) | ||||
| 	{ | ||||
| 		$result = strval($str); | ||||
| 	 | ||||
| 		$plural_rules = array( | ||||
| 			'/^(ox)$/'                 => '\1\2en',     // ox | ||||
| 			'/([m|l])ouse$/'           => '\1ice',      // mouse, louse | ||||
| 			'/(matr|vert|ind)ix|ex$/'  => '\1ices',     // matrix, vertex, index | ||||
| 			'/(x|ch|ss|sh)$/'          => '\1es',       // search, switch, fix, box, process, address | ||||
| 			'/([^aeiouy]|qu)y$/'       => '\1ies',      // query, ability, agency | ||||
| 			'/(hive)$/'                => '\1s',        // archive, hive | ||||
| 			'/(?:([^f])fe|([lr])f)$/'  => '\1\2ves',    // half, safe, wife | ||||
| 			'/sis$/'                   => 'ses',        // basis, diagnosis | ||||
| 			'/([ti])um$/'              => '\1a',        // datum, medium | ||||
| 			'/(p)erson$/'              => '\1eople',    // person, salesperson | ||||
| 			'/(m)an$/'                 => '\1en',       // man, woman, spokesman | ||||
| 			'/(c)hild$/'               => '\1hildren',  // child | ||||
| 			'/(buffal|tomat)o$/'       => '\1\2oes',    // buffalo, tomato | ||||
| 			'/(bu|campu)s$/'           => '\1\2ses',    // bus, campus | ||||
| 			'/(alias|status|virus)/'   => '\1es',       // alias | ||||
| 			'/(octop)us$/'             => '\1i',        // octopus | ||||
| 			'/(ax|cris|test)is$/'      => '\1es',       // axis, crisis | ||||
| 			'/s$/'                     => 's',          // no change (compatibility) | ||||
| 			'/$/'                      => 's', | ||||
| 		); | ||||
|  | ||||
| 		foreach ($plural_rules as $rule => $replacement) | ||||
| 		{ | ||||
| 			if (preg_match($rule, $result)) | ||||
| 			{ | ||||
| 				$result = preg_replace($rule, $replacement, $result); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $result; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Camelize | ||||
|  * | ||||
|  * Takes multiple words separated by spaces or underscores and camelizes them | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	str | ||||
|  */ | ||||
| if ( ! function_exists('camelize')) | ||||
| { | ||||
| 	function camelize($str) | ||||
| 	{ | ||||
| 		$str = 'x'.strtolower(trim($str)); | ||||
| 		$str = ucwords(preg_replace('/[\s_]+/', ' ', $str)); | ||||
| 		return substr(str_replace(' ', '', $str), 1); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Underscore | ||||
|  * | ||||
|  * Takes multiple words separated by spaces and underscores them | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	str | ||||
|  */ | ||||
| if ( ! function_exists('underscore')) | ||||
| { | ||||
| 	function underscore($str) | ||||
| 	{ | ||||
| 		return preg_replace('/[\s]+/', '_', strtolower(trim($str))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Humanize | ||||
|  * | ||||
|  * Takes multiple words separated by underscores and changes them to spaces | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	str | ||||
|  */ | ||||
| if ( ! function_exists('humanize')) | ||||
| { | ||||
| 	function humanize($str) | ||||
| 	{ | ||||
| 		return ucwords(preg_replace('/[_]+/', ' ', strtolower(trim($str)))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file inflector_helper.php */ | ||||
| /* Location: ./system/helpers/inflector_helper.php */ | ||||
							
								
								
									
										58
									
								
								system/helpers/language_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								system/helpers/language_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Language Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/language_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Lang | ||||
|  * | ||||
|  * Fetches a language variable and optionally outputs a form label | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the language line | ||||
|  * @param	string	the id of the form element | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('lang')) | ||||
| { | ||||
| 	function lang($line, $id = '') | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		$line = $CI->lang->line($line); | ||||
|  | ||||
| 		if ($id != '') | ||||
| 		{ | ||||
| 			$line = '<label for="'.$id.'">'.$line."</label>"; | ||||
| 		} | ||||
|  | ||||
| 		return $line; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
| /* End of file language_helper.php */ | ||||
| /* Location: ./system/helpers/language_helper.php */ | ||||
							
								
								
									
										76
									
								
								system/helpers/number_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								system/helpers/number_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Number Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/number_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Formats a numbers as bytes, based on size, and adds the appropriate suffix | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	mixed	// will be cast as int | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('byte_format')) | ||||
| { | ||||
| 	function byte_format($num, $precision = 1) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		$CI->lang->load('number'); | ||||
|  | ||||
| 		if ($num >= 1000000000000) | ||||
| 		{ | ||||
| 			$num = round($num / 1099511627776, $precision); | ||||
| 			$unit = $CI->lang->line('terabyte_abbr'); | ||||
| 		} | ||||
| 		elseif ($num >= 1000000000) | ||||
| 		{ | ||||
| 			$num = round($num / 1073741824, $precision); | ||||
| 			$unit = $CI->lang->line('gigabyte_abbr'); | ||||
| 		} | ||||
| 		elseif ($num >= 1000000) | ||||
| 		{ | ||||
| 			$num = round($num / 1048576, $precision); | ||||
| 			$unit = $CI->lang->line('megabyte_abbr'); | ||||
| 		} | ||||
| 		elseif ($num >= 1000) | ||||
| 		{ | ||||
| 			$num = round($num / 1024, $precision); | ||||
| 			$unit = $CI->lang->line('kilobyte_abbr'); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$unit = $CI->lang->line('bytes'); | ||||
| 			return number_format($num).' '.$unit; | ||||
| 		} | ||||
|  | ||||
| 		return number_format($num, $precision).' '.$unit; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file number_helper.php */ | ||||
| /* Location: ./system/helpers/number_helper.php */ | ||||
							
								
								
									
										72
									
								
								system/helpers/path_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								system/helpers/path_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Path Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/xml_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Set Realpath | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	bool	checks to see if the path exists | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('set_realpath')) | ||||
| { | ||||
| 	function set_realpath($path, $check_existance = FALSE) | ||||
| 	{ | ||||
| 		// Security check to make sure the path is NOT a URL.  No remote file inclusion! | ||||
| 		if (preg_match("#^(http:\/\/|https:\/\/|www\.|ftp|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})#i", $path)) | ||||
| 		{ | ||||
| 			show_error('The path you submitted must be a local server path, not a URL'); | ||||
| 		} | ||||
|  | ||||
| 		// Resolve the path | ||||
| 		if (function_exists('realpath') AND @realpath($path) !== FALSE) | ||||
| 		{ | ||||
| 			$path = realpath($path).'/'; | ||||
| 		} | ||||
|  | ||||
| 		// Add a trailing slash | ||||
| 		$path = preg_replace("#([^/])/*$#", "\\1/", $path); | ||||
|  | ||||
| 		// Make sure the path exists | ||||
| 		if ($check_existance == TRUE) | ||||
| 		{ | ||||
| 			if ( ! is_dir($path)) | ||||
| 			{ | ||||
| 				show_error('Not a valid path: '.$path); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $path; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file path_helper.php */ | ||||
| /* Location: ./system/helpers/path_helper.php */ | ||||
							
								
								
									
										128
									
								
								system/helpers/security_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								system/helpers/security_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Security Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/security_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * XSS Filtering | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	bool	whether or not the content is an image file | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('xss_clean')) | ||||
| { | ||||
| 	function xss_clean($str, $is_image = FALSE) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->security->xss_clean($str, $is_image); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Sanitize Filename | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('sanitize_filename')) | ||||
| { | ||||
| 	function sanitize_filename($filename) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->security->sanitize_filename($filename); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Hash encode a string | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('do_hash')) | ||||
| { | ||||
| 	function do_hash($str, $type = 'sha1') | ||||
| 	{ | ||||
| 		if ($type == 'sha1') | ||||
| 		{ | ||||
| 			return sha1($str); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return md5($str); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Strip Image Tags | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('strip_image_tags')) | ||||
| { | ||||
| 	function strip_image_tags($str) | ||||
| 	{ | ||||
| 		$str = preg_replace("#<img\s+.*?src\s*=\s*[\"'](.+?)[\"'].*?\>#", "\\1", $str); | ||||
| 		$str = preg_replace("#<img\s+.*?src\s*=\s*(.+?).*?\>#", "\\1", $str); | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Convert PHP tags to entities | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('encode_php_tags')) | ||||
| { | ||||
| 	function encode_php_tags($str) | ||||
| 	{ | ||||
| 		return str_replace(array('<?php', '<?PHP', '<?', '?>'),  array('<?php', '<?PHP', '<?', '?>'), $str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file security_helper.php */ | ||||
| /* Location: ./system/helpers/security_helper.php */ | ||||
							
								
								
									
										281
									
								
								system/helpers/smiley_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										281
									
								
								system/helpers/smiley_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,281 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Smiley Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/smiley_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Smiley Javascript | ||||
|  * | ||||
|  * Returns the javascript required for the smiley insertion.  Optionally takes | ||||
|  * an array of aliases to loosely couple the smiley array to the view. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	mixed	alias name or array of alias->field_id pairs | ||||
|  * @param	string	field_id if alias name was passed in | ||||
|  * @return	array | ||||
|  */ | ||||
| if ( ! function_exists('smiley_js')) | ||||
| { | ||||
| 	function smiley_js($alias = '', $field_id = '', $inline = TRUE) | ||||
| 	{ | ||||
| 		static $do_setup = TRUE; | ||||
|  | ||||
| 		$r = ''; | ||||
|  | ||||
| 		if ($alias != '' && ! is_array($alias)) | ||||
| 		{ | ||||
| 			$alias = array($alias => $field_id); | ||||
| 		} | ||||
|  | ||||
| 		if ($do_setup === TRUE) | ||||
| 		{ | ||||
| 				$do_setup = FALSE; | ||||
|  | ||||
| 				$m = array(); | ||||
|  | ||||
| 				if (is_array($alias)) | ||||
| 				{ | ||||
| 					foreach ($alias as $name => $id) | ||||
| 					{ | ||||
| 						$m[] = '"'.$name.'" : "'.$id.'"'; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				$m = '{'.implode(',', $m).'}'; | ||||
|  | ||||
| 				$r .= <<<EOF | ||||
| 				var smiley_map = {$m}; | ||||
|  | ||||
| 				function insert_smiley(smiley, field_id) { | ||||
| 					var el = document.getElementById(field_id), newStart; | ||||
|  | ||||
| 					if ( ! el && smiley_map[field_id]) { | ||||
| 						el = document.getElementById(smiley_map[field_id]); | ||||
|  | ||||
| 						if ( ! el) | ||||
| 							return false; | ||||
| 					} | ||||
|  | ||||
| 					el.focus(); | ||||
| 					smiley = " " + smiley; | ||||
|  | ||||
| 					if ('selectionStart' in el) { | ||||
| 						newStart = el.selectionStart + smiley.length; | ||||
|  | ||||
| 						el.value = el.value.substr(0, el.selectionStart) + | ||||
| 										smiley + | ||||
| 										el.value.substr(el.selectionEnd, el.value.length); | ||||
| 						el.setSelectionRange(newStart, newStart); | ||||
| 					} | ||||
| 					else if (document.selection) { | ||||
| 						document.selection.createRange().text = smiley; | ||||
| 					} | ||||
| 				} | ||||
| EOF; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if (is_array($alias)) | ||||
| 			{ | ||||
| 				foreach ($alias as $name => $id) | ||||
| 				{ | ||||
| 					$r .= 'smiley_map["'.$name.'"] = "'.$id.'";'."\n"; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($inline) | ||||
| 		{ | ||||
| 			return '<script type="text/javascript" charset="utf-8">/*<![CDATA[ */'.$r.'// ]]></script>'; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			return $r; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Get Clickable Smileys | ||||
|  * | ||||
|  * Returns an array of image tag links that can be clicked to be inserted | ||||
|  * into a form field. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the URL to the folder containing the smiley images | ||||
|  * @return	array | ||||
|  */ | ||||
| if ( ! function_exists('get_clickable_smileys')) | ||||
| { | ||||
| 	function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) | ||||
| 	{ | ||||
| 		// For backward compatibility with js_insert_smiley | ||||
|  | ||||
| 		if (is_array($alias)) | ||||
| 		{ | ||||
| 			$smileys = $alias; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_array($smileys)) | ||||
| 		{ | ||||
| 			if (FALSE === ($smileys = _get_smiley_array())) | ||||
| 			{ | ||||
| 				return $smileys; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Add a trailing slash to the file path if needed | ||||
| 		$image_url = rtrim($image_url, '/').'/'; | ||||
|  | ||||
| 		$used = array(); | ||||
| 		foreach ($smileys as $key => $val) | ||||
| 		{ | ||||
| 			// Keep duplicates from being used, which can happen if the | ||||
| 			// mapping array contains multiple identical replacements.  For example: | ||||
| 			// :-) and :) might be replaced with the same image so both smileys | ||||
| 			// will be in the array. | ||||
| 			if (isset($used[$smileys[$key][0]])) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			$link[] = "<a href=\"javascript:void(0);\" onclick=\"insert_smiley('".$key."', '".$alias."')\"><img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" /></a>"; | ||||
|  | ||||
| 			$used[$smileys[$key][0]] = TRUE; | ||||
| 		} | ||||
|  | ||||
| 		return $link; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Parse Smileys | ||||
|  * | ||||
|  * Takes a string as input and swaps any contained smileys for the actual image | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the text to be parsed | ||||
|  * @param	string	the URL to the folder containing the smiley images | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('parse_smileys')) | ||||
| { | ||||
| 	function parse_smileys($str = '', $image_url = '', $smileys = NULL) | ||||
| 	{ | ||||
| 		if ($image_url == '') | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_array($smileys)) | ||||
| 		{ | ||||
| 			if (FALSE === ($smileys = _get_smiley_array())) | ||||
| 			{ | ||||
| 				return $str; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Add a trailing slash to the file path if needed | ||||
| 		$image_url = preg_replace("/(.+?)\/*$/", "\\1/",  $image_url); | ||||
|  | ||||
| 		foreach ($smileys as $key => $val) | ||||
| 		{ | ||||
| 			$str = str_replace($key, "<img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" />", $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Get Smiley Array | ||||
|  * | ||||
|  * Fetches the config/smiley.php file | ||||
|  * | ||||
|  * @access	private | ||||
|  * @return	mixed | ||||
|  */ | ||||
| if ( ! function_exists('_get_smiley_array')) | ||||
| { | ||||
| 	function _get_smiley_array() | ||||
| 	{ | ||||
| 		if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) | ||||
| 		{ | ||||
| 		    include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); | ||||
| 		} | ||||
| 		elseif (file_exists(APPPATH.'config/smileys.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/smileys.php'); | ||||
| 		} | ||||
| 		 | ||||
| 		if (isset($smileys) AND is_array($smileys)) | ||||
| 		{ | ||||
| 			return $smileys; | ||||
| 		} | ||||
|  | ||||
| 		return FALSE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * JS Insert Smiley | ||||
|  * | ||||
|  * Generates the javascript function needed to insert smileys into a form field | ||||
|  * | ||||
|  * DEPRECATED as of version 1.7.2, use smiley_js instead | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	form name | ||||
|  * @param	string	field name | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('js_insert_smiley')) | ||||
| { | ||||
| 	function js_insert_smiley($form_name = '', $form_field = '') | ||||
| 	{ | ||||
| 		return <<<EOF | ||||
| <script type="text/javascript"> | ||||
| 	function insert_smiley(smiley) | ||||
| 	{ | ||||
| 		document.{$form_name}.{$form_field}.value += " " + smiley; | ||||
| 	} | ||||
| </script> | ||||
| EOF; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file smiley_helper.php */ | ||||
| /* Location: ./system/helpers/smiley_helper.php */ | ||||
							
								
								
									
										307
									
								
								system/helpers/string_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								system/helpers/string_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,307 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter String Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/string_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Trim Slashes | ||||
|  * | ||||
|  * Removes any leading/trailing slashes from a string: | ||||
|  * | ||||
|  * /this/that/theother/ | ||||
|  * | ||||
|  * becomes: | ||||
|  * | ||||
|  * this/that/theother | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('trim_slashes')) | ||||
| { | ||||
| 	function trim_slashes($str) | ||||
| 	{ | ||||
| 		return trim($str, '/'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Strip Slashes | ||||
|  * | ||||
|  * Removes slashes contained in a string or in an array | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	mixed	string or array | ||||
|  * @return	mixed	string or array | ||||
|  */ | ||||
| if ( ! function_exists('strip_slashes')) | ||||
| { | ||||
| 	function strip_slashes($str) | ||||
| 	{ | ||||
| 		if (is_array($str)) | ||||
| 		{ | ||||
| 			foreach ($str as $key => $val) | ||||
| 			{ | ||||
| 				$str[$key] = strip_slashes($val); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$str = stripslashes($str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Strip Quotes | ||||
|  * | ||||
|  * Removes single and double quotes from a string | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('strip_quotes')) | ||||
| { | ||||
| 	function strip_quotes($str) | ||||
| 	{ | ||||
| 		return str_replace(array('"', "'"), '', $str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Quotes to Entities | ||||
|  * | ||||
|  * Converts single and double quotes to entities | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('quotes_to_entities')) | ||||
| { | ||||
| 	function quotes_to_entities($str) | ||||
| 	{ | ||||
| 		return str_replace(array("\'","\"","'",'"'), array("'",""","'","""), $str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Reduce Double Slashes | ||||
|  * | ||||
|  * Converts double slashes in a string to a single slash, | ||||
|  * except those found in http:// | ||||
|  * | ||||
|  * http://www.some-site.com//index.php | ||||
|  * | ||||
|  * becomes: | ||||
|  * | ||||
|  * http://www.some-site.com/index.php | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('reduce_double_slashes')) | ||||
| { | ||||
| 	function reduce_double_slashes($str) | ||||
| 	{ | ||||
| 		return preg_replace("#(^|[^:])//+#", "\\1/", $str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Reduce Multiples | ||||
|  * | ||||
|  * Reduces multiple instances of a particular character.  Example: | ||||
|  * | ||||
|  * Fred, Bill,, Joe, Jimmy | ||||
|  * | ||||
|  * becomes: | ||||
|  * | ||||
|  * Fred, Bill, Joe, Jimmy | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	string	the character you wish to reduce | ||||
|  * @param	bool	TRUE/FALSE - whether to trim the character from the beginning/end | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('reduce_multiples')) | ||||
| { | ||||
| 	function reduce_multiples($str, $character = ',', $trim = FALSE) | ||||
| 	{ | ||||
| 		$str = preg_replace('#'.preg_quote($character, '#').'{2,}#', $character, $str); | ||||
|  | ||||
| 		if ($trim === TRUE) | ||||
| 		{ | ||||
| 			$str = trim($str, $character); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Create a Random String | ||||
|  * | ||||
|  * Useful for generating passwords or hashes. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	type of random string.  basic, alpha, alunum, numeric, nozero, unique, md5, encrypt and sha1 | ||||
|  * @param	integer	number of characters | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('random_string')) | ||||
| { | ||||
| 	function random_string($type = 'alnum', $len = 8) | ||||
| 	{ | ||||
| 		switch($type) | ||||
| 		{ | ||||
| 			case 'basic'	: return mt_rand(); | ||||
| 				break; | ||||
| 			case 'alnum'	: | ||||
| 			case 'numeric'	: | ||||
| 			case 'nozero'	: | ||||
| 			case 'alpha'	: | ||||
|  | ||||
| 					switch ($type) | ||||
| 					{ | ||||
| 						case 'alpha'	:	$pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; | ||||
| 							break; | ||||
| 						case 'alnum'	:	$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; | ||||
| 							break; | ||||
| 						case 'numeric'	:	$pool = '0123456789'; | ||||
| 							break; | ||||
| 						case 'nozero'	:	$pool = '123456789'; | ||||
| 							break; | ||||
| 					} | ||||
|  | ||||
| 					$str = ''; | ||||
| 					for ($i=0; $i < $len; $i++) | ||||
| 					{ | ||||
| 						$str .= substr($pool, mt_rand(0, strlen($pool) -1), 1); | ||||
| 					} | ||||
| 					return $str; | ||||
| 				break; | ||||
| 			case 'unique'	: | ||||
| 			case 'md5'		: | ||||
|  | ||||
| 						return md5(uniqid(mt_rand())); | ||||
| 				break; | ||||
| 			case 'encrypt'	: | ||||
| 			case 'sha1'	: | ||||
|  | ||||
| 						$CI =& get_instance(); | ||||
| 						$CI->load->helper('security'); | ||||
|  | ||||
| 						return do_hash(uniqid(mt_rand(), TRUE), 'sha1'); | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Add's _1 to a string or increment the ending number to allow _2, _3, etc | ||||
|  * | ||||
|  * @param   string  $str  required | ||||
|  * @param   string  $separator  What should the duplicate number be appended with | ||||
|  * @param   string  $first  Which number should be used for the first dupe increment | ||||
|  * @return  string | ||||
|  */ | ||||
| function increment_string($str, $separator = '_', $first = 1) | ||||
| { | ||||
| 	preg_match('/(.+)'.$separator.'([0-9]+)$/', $str, $match); | ||||
|  | ||||
| 	return isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $str.$separator.$first; | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Alternator | ||||
|  * | ||||
|  * Allows strings to be alternated.  See docs... | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string (as many parameters as needed) | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('alternator')) | ||||
| { | ||||
| 	function alternator() | ||||
| 	{ | ||||
| 		static $i; | ||||
|  | ||||
| 		if (func_num_args() == 0) | ||||
| 		{ | ||||
| 			$i = 0; | ||||
| 			return ''; | ||||
| 		} | ||||
| 		$args = func_get_args(); | ||||
| 		return $args[($i++ % count($args))]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Repeater function | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	integer	number of repeats | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('repeater')) | ||||
| { | ||||
| 	function repeater($data, $num = 1) | ||||
| 	{ | ||||
| 		return (($num > 0) ? str_repeat($data, $num) : ''); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file string_helper.php */ | ||||
| /* Location: ./system/helpers/string_helper.php */ | ||||
							
								
								
									
										535
									
								
								system/helpers/text_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										535
									
								
								system/helpers/text_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,535 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Text Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/text_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Word Limiter | ||||
|  * | ||||
|  * Limits a string to X number of words. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	integer | ||||
|  * @param	string	the end character. Usually an ellipsis | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('word_limiter')) | ||||
| { | ||||
| 	function word_limiter($str, $limit = 100, $end_char = '…') | ||||
| 	{ | ||||
| 		if (trim($str) == '') | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches); | ||||
|  | ||||
| 		if (strlen($str) == strlen($matches[0])) | ||||
| 		{ | ||||
| 			$end_char = ''; | ||||
| 		} | ||||
|  | ||||
| 		return rtrim($matches[0]).$end_char; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Character Limiter | ||||
|  * | ||||
|  * Limits the string based on the character count.  Preserves complete words | ||||
|  * so the character count may not be exactly as specified. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	integer | ||||
|  * @param	string	the end character. Usually an ellipsis | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('character_limiter')) | ||||
| { | ||||
| 	function character_limiter($str, $n = 500, $end_char = '…') | ||||
| 	{ | ||||
| 		if (strlen($str) < $n) | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); | ||||
|  | ||||
| 		if (strlen($str) <= $n) | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$out = ""; | ||||
| 		foreach (explode(' ', trim($str)) as $val) | ||||
| 		{ | ||||
| 			$out .= $val.' '; | ||||
|  | ||||
| 			if (strlen($out) >= $n) | ||||
| 			{ | ||||
| 				$out = trim($out); | ||||
| 				return (strlen($out) == strlen($str)) ? $out : $out.$end_char; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * High ASCII to Entities | ||||
|  * | ||||
|  * Converts High ascii text and MS Word special characters to character entities | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('ascii_to_entities')) | ||||
| { | ||||
| 	function ascii_to_entities($str) | ||||
| 	{ | ||||
| 		$count	= 1; | ||||
| 		$out	= ''; | ||||
| 		$temp	= array(); | ||||
|  | ||||
| 		for ($i = 0, $s = strlen($str); $i < $s; $i++) | ||||
| 		{ | ||||
| 			$ordinal = ord($str[$i]); | ||||
|  | ||||
| 			if ($ordinal < 128) | ||||
| 			{ | ||||
| 				/* | ||||
| 					If the $temp array has a value but we have moved on, then it seems only | ||||
| 					fair that we output that entity and restart $temp before continuing. -Paul | ||||
| 				*/ | ||||
| 				if (count($temp) == 1) | ||||
| 				{ | ||||
| 					$out  .= '&#'.array_shift($temp).';'; | ||||
| 					$count = 1; | ||||
| 				} | ||||
|  | ||||
| 				$out .= $str[$i]; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if (count($temp) == 0) | ||||
| 				{ | ||||
| 					$count = ($ordinal < 224) ? 2 : 3; | ||||
| 				} | ||||
|  | ||||
| 				$temp[] = $ordinal; | ||||
|  | ||||
| 				if (count($temp) == $count) | ||||
| 				{ | ||||
| 					$number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64); | ||||
|  | ||||
| 					$out .= '&#'.$number.';'; | ||||
| 					$count = 1; | ||||
| 					$temp = array(); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $out; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Entities to ASCII | ||||
|  * | ||||
|  * Converts character entities back to ASCII | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	bool | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('entities_to_ascii')) | ||||
| { | ||||
| 	function entities_to_ascii($str, $all = TRUE) | ||||
| 	{ | ||||
| 		if (preg_match_all('/\&#(\d+)\;/', $str, $matches)) | ||||
| 		{ | ||||
| 			for ($i = 0, $s = count($matches['0']); $i < $s; $i++) | ||||
| 			{ | ||||
| 				$digits = $matches['1'][$i]; | ||||
|  | ||||
| 				$out = ''; | ||||
|  | ||||
| 				if ($digits < 128) | ||||
| 				{ | ||||
| 					$out .= chr($digits); | ||||
|  | ||||
| 				} | ||||
| 				elseif ($digits < 2048) | ||||
| 				{ | ||||
| 					$out .= chr(192 + (($digits - ($digits % 64)) / 64)); | ||||
| 					$out .= chr(128 + ($digits % 64)); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$out .= chr(224 + (($digits - ($digits % 4096)) / 4096)); | ||||
| 					$out .= chr(128 + ((($digits % 4096) - ($digits % 64)) / 64)); | ||||
| 					$out .= chr(128 + ($digits % 64)); | ||||
| 				} | ||||
|  | ||||
| 				$str = str_replace($matches['0'][$i], $out, $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($all) | ||||
| 		{ | ||||
| 			$str = str_replace(array("&", "<", ">", """, "'", "-"), | ||||
| 								array("&","<",">","\"", "'", "-"), | ||||
| 								$str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Word Censoring Function | ||||
|  * | ||||
|  * Supply a string and an array of disallowed words and any | ||||
|  * matched words will be converted to #### or to the replacement | ||||
|  * word you've submitted. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the text string | ||||
|  * @param	string	the array of censoered words | ||||
|  * @param	string	the optional replacement value | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('word_censor')) | ||||
| { | ||||
| 	function word_censor($str, $censored, $replacement = '') | ||||
| 	{ | ||||
| 		if ( ! is_array($censored)) | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$str = ' '.$str.' '; | ||||
|  | ||||
| 		// \w, \b and a few others do not match on a unicode character | ||||
| 		// set for performance reasons. As a result words like über | ||||
| 		// will not match on a word boundary. Instead, we'll assume that | ||||
| 		// a bad word will be bookeneded by any of these characters. | ||||
| 		$delim = '[-_\'\"`(){}<>\[\]|!?@#%&,.:;^~*+=\/ 0-9\n\r\t]'; | ||||
|  | ||||
| 		foreach ($censored as $badword) | ||||
| 		{ | ||||
| 			if ($replacement != '') | ||||
| 			{ | ||||
| 				$str = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")({$delim})/i", "\\1{$replacement}\\3", $str); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$str = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")({$delim})/ie", "'\\1'.str_repeat('#', strlen('\\2')).'\\3'", $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return trim($str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Code Highlighter | ||||
|  * | ||||
|  * Colorizes code strings | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the text string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('highlight_code')) | ||||
| { | ||||
| 	function highlight_code($str) | ||||
| 	{ | ||||
| 		// The highlight string function encodes and highlights | ||||
| 		// brackets so we need them to start raw | ||||
| 		$str = str_replace(array('<', '>'), array('<', '>'), $str); | ||||
|  | ||||
| 		// Replace any existing PHP tags to temporary markers so they don't accidentally | ||||
| 		// break the string out of PHP, and thus, thwart the highlighting. | ||||
|  | ||||
| 		$str = str_replace(array('<?', '?>', '<%', '%>', '\\', '</script>'), | ||||
| 							array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), $str); | ||||
|  | ||||
| 		// The highlight_string function requires that the text be surrounded | ||||
| 		// by PHP tags, which we will remove later | ||||
| 		$str = '<?php '.$str.' ?>'; // <? | ||||
|  | ||||
| 		// All the magic happens here, baby! | ||||
| 		$str = highlight_string($str, TRUE); | ||||
|  | ||||
| 		// Prior to PHP 5, the highligh function used icky <font> tags | ||||
| 		// so we'll replace them with <span> tags. | ||||
|  | ||||
| 		if (abs(PHP_VERSION) < 5) | ||||
| 		{ | ||||
| 			$str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str); | ||||
| 			$str = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str); | ||||
| 		} | ||||
|  | ||||
| 		// Remove our artificially added PHP, and the syntax highlighting that came with it | ||||
| 		$str = preg_replace('/<span style="color: #([A-Z0-9]+)"><\?php( | )/i', '<span style="color: #$1">', $str); | ||||
| 		$str = preg_replace('/(<span style="color: #[A-Z0-9]+">.*?)\?><\/span>\n<\/span>\n<\/code>/is', "$1</span>\n</span>\n</code>", $str); | ||||
| 		$str = preg_replace('/<span style="color: #[A-Z0-9]+"\><\/span>/i', '', $str); | ||||
|  | ||||
| 		// Replace our markers back to PHP tags. | ||||
| 		$str = str_replace(array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), | ||||
| 							array('<?', '?>', '<%', '%>', '\\', '</script>'), $str); | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Phrase Highlighter | ||||
|  * | ||||
|  * Highlights a phrase within a text string | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the text string | ||||
|  * @param	string	the phrase you'd like to highlight | ||||
|  * @param	string	the openging tag to precede the phrase with | ||||
|  * @param	string	the closing tag to end the phrase with | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('highlight_phrase')) | ||||
| { | ||||
| 	function highlight_phrase($str, $phrase, $tag_open = '<strong>', $tag_close = '</strong>') | ||||
| 	{ | ||||
| 		if ($str == '') | ||||
| 		{ | ||||
| 			return ''; | ||||
| 		} | ||||
|  | ||||
| 		if ($phrase != '') | ||||
| 		{ | ||||
| 			return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open."\\1".$tag_close, $str); | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Convert Accented Foreign Characters to ASCII | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the text string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('convert_accented_characters')) | ||||
| { | ||||
| 	function convert_accented_characters($str) | ||||
| 	{ | ||||
| 		if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'); | ||||
| 		} | ||||
| 		elseif (is_file(APPPATH.'config/foreign_chars.php')) | ||||
| 		{ | ||||
| 			include(APPPATH.'config/foreign_chars.php'); | ||||
| 		} | ||||
|  | ||||
| 		if ( ! isset($foreign_characters)) | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		return preg_replace(array_keys($foreign_characters), array_values($foreign_characters), $str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Word Wrap | ||||
|  * | ||||
|  * Wraps text at the specified character.  Maintains the integrity of words. | ||||
|  * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor | ||||
|  * will URLs. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the text string | ||||
|  * @param	integer	the number of characters to wrap at | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('word_wrap')) | ||||
| { | ||||
| 	function word_wrap($str, $charlim = '76') | ||||
| 	{ | ||||
| 		// Se the character limit | ||||
| 		if ( ! is_numeric($charlim)) | ||||
| 			$charlim = 76; | ||||
|  | ||||
| 		// Reduce multiple spaces | ||||
| 		$str = preg_replace("| +|", " ", $str); | ||||
|  | ||||
| 		// Standardize newlines | ||||
| 		if (strpos($str, "\r") !== FALSE) | ||||
| 		{ | ||||
| 			$str = str_replace(array("\r\n", "\r"), "\n", $str); | ||||
| 		} | ||||
|  | ||||
| 		// If the current word is surrounded by {unwrap} tags we'll | ||||
| 		// strip the entire chunk and replace it with a marker. | ||||
| 		$unwrap = array(); | ||||
| 		if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches)) | ||||
| 		{ | ||||
| 			for ($i = 0; $i < count($matches['0']); $i++) | ||||
| 			{ | ||||
| 				$unwrap[] = $matches['1'][$i]; | ||||
| 				$str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Use PHP's native function to do the initial wordwrap. | ||||
| 		// We set the cut flag to FALSE so that any individual words that are | ||||
| 		// too long get left alone.  In the next step we'll deal with them. | ||||
| 		$str = wordwrap($str, $charlim, "\n", FALSE); | ||||
|  | ||||
| 		// Split the string into individual lines of text and cycle through them | ||||
| 		$output = ""; | ||||
| 		foreach (explode("\n", $str) as $line) | ||||
| 		{ | ||||
| 			// Is the line within the allowed character count? | ||||
| 			// If so we'll join it to the output and continue | ||||
| 			if (strlen($line) <= $charlim) | ||||
| 			{ | ||||
| 				$output .= $line."\n"; | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			$temp = ''; | ||||
| 			while ((strlen($line)) > $charlim) | ||||
| 			{ | ||||
| 				// If the over-length word is a URL we won't wrap it | ||||
| 				if (preg_match("!\[url.+\]|://|wwww.!", $line)) | ||||
| 				{ | ||||
| 					break; | ||||
| 				} | ||||
|  | ||||
| 				// Trim the word down | ||||
| 				$temp .= substr($line, 0, $charlim-1); | ||||
| 				$line = substr($line, $charlim-1); | ||||
| 			} | ||||
|  | ||||
| 			// If $temp contains data it means we had to split up an over-length | ||||
| 			// word into smaller chunks so we'll add it back to our current line | ||||
| 			if ($temp != '') | ||||
| 			{ | ||||
| 				$output .= $temp."\n".$line; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$output .= $line; | ||||
| 			} | ||||
|  | ||||
| 			$output .= "\n"; | ||||
| 		} | ||||
|  | ||||
| 		// Put our markers back | ||||
| 		if (count($unwrap) > 0) | ||||
| 		{ | ||||
| 			foreach ($unwrap as $key => $val) | ||||
| 			{ | ||||
| 				$output = str_replace("{{unwrapped".$key."}}", $val, $output); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Remove the unwrap tags | ||||
| 		$output = str_replace(array('{unwrap}', '{/unwrap}'), '', $output); | ||||
|  | ||||
| 		return $output; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Ellipsize String | ||||
|  * | ||||
|  * This function will strip tags from a string, split it at its max_length and ellipsize | ||||
|  * | ||||
|  * @param	string		string to ellipsize | ||||
|  * @param	integer		max length of string | ||||
|  * @param	mixed		int (1|0) or float, .5, .2, etc for position to split | ||||
|  * @param	string		ellipsis ; Default '...' | ||||
|  * @return	string		ellipsized string | ||||
|  */ | ||||
| if ( ! function_exists('ellipsize')) | ||||
| { | ||||
| 	function ellipsize($str, $max_length, $position = 1, $ellipsis = '…') | ||||
| 	{ | ||||
| 		// Strip tags | ||||
| 		$str = trim(strip_tags($str)); | ||||
|  | ||||
| 		// Is the string long enough to ellipsize? | ||||
| 		if (strlen($str) <= $max_length) | ||||
| 		{ | ||||
| 			return $str; | ||||
| 		} | ||||
|  | ||||
| 		$beg = substr($str, 0, floor($max_length * $position)); | ||||
|  | ||||
| 		$position = ($position > 1) ? 1 : $position; | ||||
|  | ||||
| 		if ($position === 1) | ||||
| 		{ | ||||
| 			$end = substr($str, 0, -($max_length - strlen($beg))); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$end = substr($str, -($max_length - strlen($beg))); | ||||
| 		} | ||||
|  | ||||
| 		return $beg.$ellipsis.$end; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file text_helper.php */ | ||||
| /* Location: ./system/helpers/text_helper.php */ | ||||
							
								
								
									
										93
									
								
								system/helpers/typography_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								system/helpers/typography_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter Typography Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/typography_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Convert newlines to HTML line breaks except within PRE tags | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('nl2br_except_pre')) | ||||
| { | ||||
| 	function nl2br_except_pre($str) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
|  | ||||
| 		$CI->load->library('typography'); | ||||
|  | ||||
| 		return $CI->typography->nl2br_except_pre($str); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Auto Typography Wrapper Function | ||||
|  * | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @param	bool	whether to allow javascript event handlers | ||||
|  * @param	bool	whether to reduce multiple instances of double newlines to two | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('auto_typography')) | ||||
| { | ||||
| 	function auto_typography($str, $strip_js_event_handlers = TRUE, $reduce_linebreaks = FALSE) | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		$CI->load->library('typography'); | ||||
| 		return $CI->typography->auto_typography($str, $strip_js_event_handlers, $reduce_linebreaks); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| // -------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * HTML Entities Decode | ||||
|  * | ||||
|  * This function is a replacement for html_entity_decode() | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('entity_decode')) | ||||
| { | ||||
| 	function entity_decode($str, $charset='UTF-8') | ||||
| 	{ | ||||
| 		global $SEC; | ||||
| 		return $SEC->entity_decode($str, $charset); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* End of file typography_helper.php */ | ||||
| /* Location: ./system/helpers/typography_helper.php */ | ||||
							
								
								
									
										594
									
								
								system/helpers/url_helper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										594
									
								
								system/helpers/url_helper.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,594 @@ | ||||
| <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | ||||
| /** | ||||
|  * CodeIgniter | ||||
|  * | ||||
|  * An open source application development framework for PHP 5.1.6 or newer | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc. | ||||
|  * @license		http://codeigniter.com/user_guide/license.html | ||||
|  * @link		http://codeigniter.com | ||||
|  * @since		Version 1.0 | ||||
|  * @filesource | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * CodeIgniter URL Helpers | ||||
|  * | ||||
|  * @package		CodeIgniter | ||||
|  * @subpackage	Helpers | ||||
|  * @category	Helpers | ||||
|  * @author		ExpressionEngine Dev Team | ||||
|  * @link		http://codeigniter.com/user_guide/helpers/url_helper.html | ||||
|  */ | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Site URL | ||||
|  * | ||||
|  * Create a local URL based on your basepath. Segments can be passed via the | ||||
|  * first parameter either as a string or an array. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('site_url')) | ||||
| { | ||||
| 	function site_url($uri = '') | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->config->site_url($uri); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Base URL | ||||
|  *  | ||||
|  * Create a local URL based on your basepath. | ||||
|  * Segments can be passed in as a string or an array, same as site_url | ||||
|  * or a URL to a file can be passed in, e.g. to an image file. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param string | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('base_url')) | ||||
| { | ||||
| 	function base_url($uri = '') | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->config->base_url($uri); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Current URL | ||||
|  * | ||||
|  * Returns the full URL (including segments) of the page where this | ||||
|  * function is placed | ||||
|  * | ||||
|  * @access	public | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('current_url')) | ||||
| { | ||||
| 	function current_url() | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->config->site_url($CI->uri->uri_string()); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
| /** | ||||
|  * URL String | ||||
|  * | ||||
|  * Returns the URI segments. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('uri_string')) | ||||
| { | ||||
| 	function uri_string() | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->uri->uri_string(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Index page | ||||
|  * | ||||
|  * Returns the "index_page" from your config file | ||||
|  * | ||||
|  * @access	public | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('index_page')) | ||||
| { | ||||
| 	function index_page() | ||||
| 	{ | ||||
| 		$CI =& get_instance(); | ||||
| 		return $CI->config->item('index_page'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Anchor Link | ||||
|  * | ||||
|  * Creates an anchor based on the local URL. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the URL | ||||
|  * @param	string	the link title | ||||
|  * @param	mixed	any attributes | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('anchor')) | ||||
| { | ||||
| 	function anchor($uri = '', $title = '', $attributes = '') | ||||
| 	{ | ||||
| 		$title = (string) $title; | ||||
|  | ||||
| 		if ( ! is_array($uri)) | ||||
| 		{ | ||||
| 			$site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			$site_url = site_url($uri); | ||||
| 		} | ||||
|  | ||||
| 		if ($title == '') | ||||
| 		{ | ||||
| 			$title = $site_url; | ||||
| 		} | ||||
|  | ||||
| 		if ($attributes != '') | ||||
| 		{ | ||||
| 			$attributes = _parse_attributes($attributes); | ||||
| 		} | ||||
|  | ||||
| 		return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>'; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Anchor Link - Pop-up version | ||||
|  * | ||||
|  * Creates an anchor based on the local URL. The link | ||||
|  * opens a new window based on the attributes specified. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the URL | ||||
|  * @param	string	the link title | ||||
|  * @param	mixed	any attributes | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('anchor_popup')) | ||||
| { | ||||
| 	function anchor_popup($uri = '', $title = '', $attributes = FALSE) | ||||
| 	{ | ||||
| 		$title = (string) $title; | ||||
|  | ||||
| 		$site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri; | ||||
|  | ||||
| 		if ($title == '') | ||||
| 		{ | ||||
| 			$title = $site_url; | ||||
| 		} | ||||
|  | ||||
| 		if ($attributes === FALSE) | ||||
| 		{ | ||||
| 			return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank');\">".$title."</a>"; | ||||
| 		} | ||||
|  | ||||
| 		if ( ! is_array($attributes)) | ||||
| 		{ | ||||
| 			$attributes = array(); | ||||
| 		} | ||||
|  | ||||
| 		foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val) | ||||
| 		{ | ||||
| 			$atts[$key] = ( ! isset($attributes[$key])) ? $val : $attributes[$key]; | ||||
| 			unset($attributes[$key]); | ||||
| 		} | ||||
|  | ||||
| 		if ($attributes != '') | ||||
| 		{ | ||||
| 			$attributes = _parse_attributes($attributes); | ||||
| 		} | ||||
|  | ||||
| 		return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank', '"._parse_attributes($atts, TRUE)."');\"$attributes>".$title."</a>"; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Mailto Link | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the email address | ||||
|  * @param	string	the link title | ||||
|  * @param	mixed	any attributes | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('mailto')) | ||||
| { | ||||
| 	function mailto($email, $title = '', $attributes = '') | ||||
| 	{ | ||||
| 		$title = (string) $title; | ||||
|  | ||||
| 		if ($title == "") | ||||
| 		{ | ||||
| 			$title = $email; | ||||
| 		} | ||||
|  | ||||
| 		$attributes = _parse_attributes($attributes); | ||||
|  | ||||
| 		return '<a href="mailto:'.$email.'"'.$attributes.'>'.$title.'</a>'; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Encoded Mailto Link | ||||
|  * | ||||
|  * Create a spam-protected mailto link written in Javascript | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the email address | ||||
|  * @param	string	the link title | ||||
|  * @param	mixed	any attributes | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('safe_mailto')) | ||||
| { | ||||
| 	function safe_mailto($email, $title = '', $attributes = '') | ||||
| 	{ | ||||
| 		$title = (string) $title; | ||||
|  | ||||
| 		if ($title == "") | ||||
| 		{ | ||||
| 			$title = $email; | ||||
| 		} | ||||
|  | ||||
| 		for ($i = 0; $i < 16; $i++) | ||||
| 		{ | ||||
| 			$x[] = substr('<a href="mailto:', $i, 1); | ||||
| 		} | ||||
|  | ||||
| 		for ($i = 0; $i < strlen($email); $i++) | ||||
| 		{ | ||||
| 			$x[] = "|".ord(substr($email, $i, 1)); | ||||
| 		} | ||||
|  | ||||
| 		$x[] = '"'; | ||||
|  | ||||
| 		if ($attributes != '') | ||||
| 		{ | ||||
| 			if (is_array($attributes)) | ||||
| 			{ | ||||
| 				foreach ($attributes as $key => $val) | ||||
| 				{ | ||||
| 					$x[] =  ' '.$key.'="'; | ||||
| 					for ($i = 0; $i < strlen($val); $i++) | ||||
| 					{ | ||||
| 						$x[] = "|".ord(substr($val, $i, 1)); | ||||
| 					} | ||||
| 					$x[] = '"'; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				for ($i = 0; $i < strlen($attributes); $i++) | ||||
| 				{ | ||||
| 					$x[] = substr($attributes, $i, 1); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$x[] = '>'; | ||||
|  | ||||
| 		$temp = array(); | ||||
| 		for ($i = 0; $i < strlen($title); $i++) | ||||
| 		{ | ||||
| 			$ordinal = ord($title[$i]); | ||||
|  | ||||
| 			if ($ordinal < 128) | ||||
| 			{ | ||||
| 				$x[] = "|".$ordinal; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if (count($temp) == 0) | ||||
| 				{ | ||||
| 					$count = ($ordinal < 224) ? 2 : 3; | ||||
| 				} | ||||
|  | ||||
| 				$temp[] = $ordinal; | ||||
| 				if (count($temp) == $count) | ||||
| 				{ | ||||
| 					$number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64); | ||||
| 					$x[] = "|".$number; | ||||
| 					$count = 1; | ||||
| 					$temp = array(); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>'; | ||||
|  | ||||
| 		$x = array_reverse($x); | ||||
| 		ob_start(); | ||||
|  | ||||
| 	?><script type="text/javascript"> | ||||
| 	//<![CDATA[ | ||||
| 	var l=new Array(); | ||||
| 	<?php | ||||
| 	$i = 0; | ||||
| 	foreach ($x as $val){ ?>l[<?php echo $i++; ?>]='<?php echo $val; ?>';<?php } ?> | ||||
|  | ||||
| 	for (var i = l.length-1; i >= 0; i=i-1){ | ||||
| 	if (l[i].substring(0, 1) == '|') document.write("&#"+unescape(l[i].substring(1))+";"); | ||||
| 	else document.write(unescape(l[i]));} | ||||
| 	//]]> | ||||
| 	</script><?php | ||||
|  | ||||
| 		$buffer = ob_get_contents(); | ||||
| 		ob_end_clean(); | ||||
| 		return $buffer; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Auto-linker | ||||
|  * | ||||
|  * Automatically links URL and Email addresses. | ||||
|  * Note: There's a bit of extra code here to deal with | ||||
|  * URLs or emails that end in a period.  We'll strip these | ||||
|  * off and add them after the link. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the string | ||||
|  * @param	string	the type: email, url, or both | ||||
|  * @param	bool	whether to create pop-up links | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('auto_link')) | ||||
| { | ||||
| 	function auto_link($str, $type = 'both', $popup = FALSE) | ||||
| 	{ | ||||
| 		if ($type != 'email') | ||||
| 		{ | ||||
| 			if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches)) | ||||
| 			{ | ||||
| 				$pop = ($popup == TRUE) ? " target=\"_blank\" " : ""; | ||||
|  | ||||
| 				for ($i = 0; $i < count($matches['0']); $i++) | ||||
| 				{ | ||||
| 					$period = ''; | ||||
| 					if (preg_match("|\.$|", $matches['6'][$i])) | ||||
| 					{ | ||||
| 						$period = '.'; | ||||
| 						$matches['6'][$i] = substr($matches['6'][$i], 0, -1); | ||||
| 					} | ||||
|  | ||||
| 					$str = str_replace($matches['0'][$i], | ||||
| 										$matches['1'][$i].'<a href="http'. | ||||
| 										$matches['4'][$i].'://'. | ||||
| 										$matches['5'][$i]. | ||||
| 										$matches['6'][$i].'"'.$pop.'>http'. | ||||
| 										$matches['4'][$i].'://'. | ||||
| 										$matches['5'][$i]. | ||||
| 										$matches['6'][$i].'</a>'. | ||||
| 										$period, $str); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($type != 'url') | ||||
| 		{ | ||||
| 			if (preg_match_all("/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $str, $matches)) | ||||
| 			{ | ||||
| 				for ($i = 0; $i < count($matches['0']); $i++) | ||||
| 				{ | ||||
| 					$period = ''; | ||||
| 					if (preg_match("|\.$|", $matches['3'][$i])) | ||||
| 					{ | ||||
| 						$period = '.'; | ||||
| 						$matches['3'][$i] = substr($matches['3'][$i], 0, -1); | ||||
| 					} | ||||
|  | ||||
| 					$str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Prep URL | ||||
|  * | ||||
|  * Simply adds the http:// part if no scheme is included | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the URL | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('prep_url')) | ||||
| { | ||||
| 	function prep_url($str = '') | ||||
| 	{ | ||||
| 		if ($str == 'http://' OR $str == '') | ||||
| 		{ | ||||
| 			return ''; | ||||
| 		} | ||||
|  | ||||
| 		$url = parse_url($str); | ||||
|  | ||||
| 		if ( ! $url OR ! isset($url['scheme'])) | ||||
| 		{ | ||||
| 			$str = 'http://'.$str; | ||||
| 		} | ||||
|  | ||||
| 		return $str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Create URL Title | ||||
|  * | ||||
|  * Takes a "title" string as input and creates a | ||||
|  * human-friendly URL string with a "separator" string  | ||||
|  * as the word separator. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the string | ||||
|  * @param	string	the separator | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('url_title')) | ||||
| { | ||||
| 	function url_title($str, $separator = '-', $lowercase = FALSE) | ||||
| 	{ | ||||
| 		if ($separator == 'dash')  | ||||
| 		{ | ||||
| 		    $separator = '-'; | ||||
| 		} | ||||
| 		else if ($separator == 'underscore') | ||||
| 		{ | ||||
| 		    $separator = '_'; | ||||
| 		} | ||||
| 		 | ||||
| 		$q_separator = preg_quote($separator); | ||||
|  | ||||
| 		$trans = array( | ||||
| 			'&.+?;'                 => '', | ||||
| 			'[^a-z0-9 _-]'          => '', | ||||
| 			'\s+'                   => $separator, | ||||
| 			'('.$q_separator.')+'   => $separator | ||||
| 		); | ||||
|  | ||||
| 		$str = strip_tags($str); | ||||
|  | ||||
| 		foreach ($trans as $key => $val) | ||||
| 		{ | ||||
| 			$str = preg_replace("#".$key."#i", $val, $str); | ||||
| 		} | ||||
|  | ||||
| 		if ($lowercase === TRUE) | ||||
| 		{ | ||||
| 			$str = strtolower($str); | ||||
| 		} | ||||
|  | ||||
| 		return trim($str, $separator); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Header Redirect | ||||
|  * | ||||
|  * Header redirect in two flavors | ||||
|  * For very fine grained control over headers, you could use the Output | ||||
|  * Library's set_header() function. | ||||
|  * | ||||
|  * @access	public | ||||
|  * @param	string	the URL | ||||
|  * @param	string	the method: location or redirect | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('redirect')) | ||||
| { | ||||
| 	function redirect($uri = '', $method = 'location', $http_response_code = 302) | ||||
| 	{ | ||||
| 		if ( ! preg_match('#^https?://#i', $uri)) | ||||
| 		{ | ||||
| 			$uri = site_url($uri); | ||||
| 		} | ||||
|  | ||||
| 		switch($method) | ||||
| 		{ | ||||
| 			case 'refresh'	: header("Refresh:0;url=".$uri); | ||||
| 				break; | ||||
| 			default			: header("Location: ".$uri, TRUE, $http_response_code); | ||||
| 				break; | ||||
| 		} | ||||
| 		exit; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Parse out the attributes | ||||
|  * | ||||
|  * Some of the functions use this | ||||
|  * | ||||
|  * @access	private | ||||
|  * @param	array | ||||
|  * @param	bool | ||||
|  * @return	string | ||||
|  */ | ||||
| if ( ! function_exists('_parse_attributes')) | ||||
| { | ||||
| 	function _parse_attributes($attributes, $javascript = FALSE) | ||||
| 	{ | ||||
| 		if (is_string($attributes)) | ||||
| 		{ | ||||
| 			return ($attributes != '') ? ' '.$attributes : ''; | ||||
| 		} | ||||
|  | ||||
| 		$att = ''; | ||||
| 		foreach ($attributes as $key => $val) | ||||
| 		{ | ||||
| 			if ($javascript == TRUE) | ||||
| 			{ | ||||
| 				$att .= $key . '=' . $val . ','; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$att .= ' ' . $key . '="' . $val . '"'; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ($javascript == TRUE AND $att != '') | ||||
| 		{ | ||||
| 			$att = substr($att, 0, -1); | ||||
| 		} | ||||
|  | ||||
| 		return $att; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /* End of file url_helper.php */ | ||||
| /* Location: ./system/helpers/url_helper.php */ | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 alazhar
					alazhar