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